macros clojure lisp scheme hygiene

¿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?