2012-12-04 19 views
5

ho solo l'apprendimento delle macro e macro Clojure in particolare e io sono curiosa è possibile fare qualcosa di simile:Clojure var-definire macro

(defmacro with-a=hello [f] 
    `(let [a "hello"] ~f)) 

(with-a=hello (println a)) 

Questo non funziona per me e getta di errore: CompilerException java.lang.RuntimeException: Can't let qualified name: user/a, compiling:(NO_SOURCE_PATH:1)

Come ho indetto per ora, schema 's define-syntax consentire di fare qualcosa di simile, ma c'è modo clojure per questo?

risposta

8

Per impostazione predefinita, il modulo di citazione della sintassi ` impedisce l'introduzione di simboli non assegnati ai nomi e l'acquisizione di simboli nelle macro. Quando lo si fa intenzionalmente, è possibile utilizzare la sequenza ~' per introdurre un simbolo non qualificato in una macro.

(defmacro with-a=hello [f] 
    `(let [~'a "hello"] ~f)) 

user> (with-a=hello (println a)) 
hello 
nil 

macro che fanno questo hanno il nome di fantasia macro anaforiche

+4

E 'utile notare che '~'' non è una qualsiasi sequenza speciale particolare, ma solo la combinazione di '~' (lasciare la sintassi-citazione) e ''' (inizia una citazione normale). – amalloy

+0

buon punto, grazie :) –

Problemi correlati