Lisp-2 significa que tiene dos espacios de nombres: uno para las funciones, y otro para las demás cosas.
Esto significa que es menos probable que vuelva a vincular un valor de función (o valor var) en una macro, sin quererlo.
En Lisp-1, dado que hay un espacio de nombres, tiene (estadísticamente, pero no prácticamente) el doble de probabilidades de alcanzar una definición existente.
En realidad, Lisp-1s tiene la higiene cubierta con cosas como gensym
y la amplia y confusa variedad de syntax-structure
-como las macros que mantienen las cosas higiénicas.
Lo mejor que puedo decir es que el problema es principalmente un argumento del tipo "hombre de paja": es solo un problema en las implementaciones más pobres o antiguas.
Clojure ofrece macros higiénicas a través gensym
o el lector macro myvar#
(el #
es esencialmente gensym
).
Y usted no tiene que preocuparse de ámbito local revinculación de su función en sus macros, ya sea: Clojure es todo limpio:
user=> (defmacro rev [xs] `(reverse ~xs))
#'user/rev
user=> (rev [1 2 3])
(3 2 1)
user=> (let [reverse sort] (rev [1 2 5 3 6]))
(6 3 5 2 1)
Y aquí algo de higiene variables:
user=> (defmacro k [] (let [x# "n"] x#))
#'user/k
user=> (k)
"n"
user=> (let [x "l"] (k))
"n"
user=> (let [x "l"] (str (k) x))
"nl"
Aviso nuestra sexy gensym
'd x#
.
Como no obtiene ninguna respuesta (real) aquí desde hace tres horas: puede intentar preguntar esto en "Lambda the Ultimate". Puede ser expulsado porque la lista es realmente acerca de la investigación en lenguajes de programación, pero las personas allí sin duda pueden responder a su pregunta. http://lambda-the-ultimate.org/ – Eike