2010-03-29 10 views
13

Le parentesi quadre intorno agli argomenti in Clojure defn, defmacro e binding (sto dimenticando un po '?) Davvero creando un vettore o è solo una questione di sintassi, facendo risaltare gli argomenti dal resto?Le parentesi quadre di defn, defmacro e binding di Clojure sono davvero un vettore?

sto leggendo Clojure in azione in cui si afferma:

Clojure utilizza vettori per denotare argomenti delle funzioni o forme di legame.

che mi ha fatto fare questa domanda qui.

risposta

20

Sì, è davvero un vettore. Possiamo vederlo costruendo manualmente una funzione e poi valutandola:

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

Sperare che aiuti.

+0

Grande, grazie :) –

+0

Una domanda però (dopo due anni e mezzo ...), perché questo non è accettato? (defn foo (vettore 'x' y) (+ x y)) –

+1

La forma 'defn' è una macro quindi al momento dell'esame (tempo di espansione della macro) non è stato valutato nulla. Quindi, quando guarda il modulo vincolante, si aspetta un vettore ma vede invece una lista '(vector (quote x) (quote y))'. – fogus

Problemi correlati