2012-03-18 19 views
20

W clojure, chciałbym wiedzieć, jakie są różnice między trzema poniżej.W Clojure, różnica między funkcją, cytowaną funkcją i funkcją ostrych cudzysłowów

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

Wyniki są

(5 7 9) 

(4 5 6) 

(5 7 9) 

nie mogę zrozumieć zachowanie drugi za.

Czuję, że pierwszy i trzeci jest taki sam w clojure, który jest Lisp-1 i nie rozróżnia między oceną zmiennej a identycznie nazwaną funkcją.

To może być podstawowe pytanie, ale wydaje się, że nie ma wystarczającej ilości informacji. Proszę, naucz mnie.

Dzięki.

+2

Na marginesie, w idiomatycznym słownictwie idiomatyczne jest opisywanie dosłownych sekwencji wektorami zamiast cytowanych. –

+0

O, widzę. Dziękuję, Alex. –

Odpowiedz

32

chodzi trzecim przypadku, w przeciwieństwie do Common Lisp, #'+ nie odczytywać jako (function +) i odnoszą się do wartości symbolu + w obszarze nazw funkcji, ponieważ Clojure nie posiada nazw funkcji. Zamiast tego jest to (var +) i odnosi się do var o nazwie +. Zastosowanie var jest tym samym, co zastosowanie wartości zapisanej w var.

W drugim przypadku wielokrotnie dodajesz symbol do pary cyfr. Jest to ważne przez przypadek. Stosując symbol na mapie jest taka sama jak indeksowanie do tej mapy:

user> ('a {'a 1, 'b 2, 'c 3, '+ 4}) 
1 
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4}) 
4 

Jeśli dostarczyć drugi argument, to jest używane jako wartość domyślną w przypadku, gdy żaden klucz zostanie znaleziony na mapie:

user> ('+ {'a 1, 'b 2, 'c 3} 4) 
4 

Ponieważ w każdej iteracji stosuje się symbol + do pary liczb, a ponieważ liczba nie jest mapą i dlatego nie zawiera + jako klucza, drugi argument jest zwracany jako wartość domyślna nieudany mecz.

user> ('+ 'foo 4) 
4 
user> ('+ {} 4) 
4 
user> ('+ 1 4) 
4 
+0

Świetna odpowiedź. Jasne wyjaśnienie nie od razu oczywistego zachowania. Dzięki. – sw1nn

+0

Dziękuję bardzo, Matthias. Mogłem zrozumieć, co # oznacza. Nie zdawałem sobie sprawy, Var, i zignorowałem to, ale tym razem mogłem zrozumieć to głębiej. Rozumiem także zachowanie drugiego kodu. Dziękuję Ci. –

Powiązane problemy