In Common Lisp, posso definire e utilizzare una macro che acquisisce una variabile da scope lessicale, in modo che possa utilizzare in una forma let
:Come acquisire in ambito lessicale in una macro Clojure?
CL-USER> (defmacro plus9() `(+ 9 woo))
PLUS9
CL-USER> (macroexpand '(plus9))
(+ 9 WOO)
T
CL-USER> (let ((woo 1)) (plus9))
10
Tuttavia, quando definisco una macro simile a Clojure, è alla ricerca di una definizione di woo
nel user
namespace:
user=> (defmacro plus9 [] `(+ 9 woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 user/woo)
user=> (let [woo 1] (plus9))
CompilerException java.lang.RuntimeException: No such var: user/woo
Chiaramente che sto equivoco come ambiti di lavoro in Clojure. Qual è il modo corretto di raggiungere questa macro con Clojure?
http://hubpages.com/technology/Unhygenic-anaphoric-Clojure-macros-for-fun-and-profit – coredump
Sintassi citando in Clojure è specificamente progettato per * evitare * collisioni di nomi di simboli citati con nomi con lessicalismo, sulla base della teoria che questi sono tipicamente non intenzionali. Come illustrato nella risposta, devi fare un lavoro extra se è quello che stai cercando di fare. – Alex