2010-03-29 10 views
13

Czy nawiasy kwadratowe wokół argumentów w Clojure's defn, defmacro i binding (czy ja zapominam o niektórych?) Naprawdę tworzą wektor, czy jest to tylko kwestia składni, co sprawia, że ​​argumenty odróżniają się od reszty?Czy nawiasy kwadratowe w defn, defmacro i bindowaniu Clojure's są wektorem?

Czytam Clojure w działaniu, które stwierdza:

Clojure wykorzystuje wektory do oznaczenia argumenty funkcji lub formy wiążące.

, która sprawiła, że ​​zadałem to pytanie tutaj.

Odpowiedz

20

Tak, to jest naprawdę wektor. Możemy to zobaczyć, budując funkcję ręcznie, a następnie oceniając ją:

(eval (list (list 'fn (vector 'x) (list '* 'x 2)) 100)) 
;=> 200 

Nadzieję, że pomaga.

+0

Świetnie, dzięki :) –

+0

Jedno pytanie (po dwóch i pół roku ...), dlaczego nie jest to akceptowane? (defn foo (wektor 'x' y) (+ x y)) –

+1

Formularz 'defn' jest makrem, więc w momencie jego zbadania (czas ekspansji makro) nic nie zostało ocenione. Tak więc, gdy patrzy na formę wiążącą, oczekuje wektora, ale zamiast tego widzi listę '(wektor (quote x) (quote y))'. – fogus

Powiązane problemy