Что это за одно пространство имен, которое приводит к негигиеничным макросам? (в Lisp)
некоторые утверждают, что одно пространство имен в LISP приводит к негигиеничным макросам. http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
Что именно о наличии одного, двух или нескольких пространств имен, что приводит к гигиене макросов?
1 ответов
Lisp-2 означает, что у вас есть два пространства имен: одно для функций, одно для другого.
это означает, что вы с меньшей вероятностью повторно свяжете значение функции (или значение var) в макросе, невольно.
в Lisp-1, поскольку есть одно пространство имен, вы (статистически, но не практически) в два раза чаще попадаете в существующее определение.
на самом деле, Lisp-1s имеют гигиену, покрытую такими вещами, как gensym
и схема запутанно широкий массив syntax-structure
-как макросы, которые держат все гигиенично.
насколько я могу судить, проблема в основном аргумент: вопрос только в бедных или старых реализациях.
в Clojure предлагает гигиенические макросы через gensym
или ридер макрос myvar#
(the #
по сути gensym
).
и вам не нужно беспокоиться о том, что локальная область переопределяет вашу функцию в ваших макросах: Clojure все чисто:
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)
и вот некоторые переменные гигиены:
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"
обратите внимание на нашу сексуальность gensym
' d x#
.