¿Qué pasa con un solo espacio de nombres que conduce a macros antihigiénicos?(en LISP)
clojure scheme (1)
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 de var) en una macro, sin quererlo.
En Lisp-1, dado que hay un espacio de nombres, usted es (estadísticamente, pero no prácticamente) el doble de probabilidades de alcanzar una definición existente.
En realidad, los Lisp-1s tienen una higiene cubierta con cosas como gensym
y la amplia y confusa variedad de macros de syntax-structure
de syntax-structure
que mantienen las cosas higiénicas.
Lo mejor que puedo decir es que el problema es principalmente un argumento de hombre de paja: es solo un problema en las implementaciones más pobres o antiguas.
Clojure ofrece macros higiénicas a través de gensym
o el lector macro myvar#
(el #
es esencialmente gensym
).
Y no tiene que preocuparse por el alcance local de volver a vincular su función en sus macros: Clojure está 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í hay alguna higiene variable:
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"
Observe nuestro gensym
sexy ''d x#
.
Algunos afirman que un único espacio de nombres en LISP conduce a macros antihigiénicos. http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
¿Qué es exactamente tener espacios de nombres únicos, duales o múltiples que conducen a la macro higiene?