有人声称LISP中的单个 namespace 会导致不卫生的宏。
http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
具有单个,双重或多个命名空间导致宏观卫生的确切含义是什么?
最佳答案
Lisp-2意味着您有两个 namespace :一个用于函数,一个用于其他内容。
这意味着您不太可能在不经意间重新绑定(bind)宏中的函数值(或var值)。
在Lisp-1中,由于存在一个 namespace ,因此(从统计上,但实际上不是)达到现有定义的可能性是您的两倍。
实际上,Lisp-1的卫生覆盖着诸如gensym
之类的东西,而Scheme包含大量令人迷惑的syntax-structure
之类的宏,它们使事物保持卫生。
尽我所知,这个问题主要是一个稻草人的论点:这只是较贫穷或较旧的实现中的一个问题。
Clojure通过gensym
或阅读器宏myvar#
提供了卫生宏(#
本质上是gensym
)。
您也不必担心本地范围在宏中重新绑定(bind)函数,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#
。