有人声称 LISP 中的单个命名空间会导致宏不卫生。 http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
拥有单一、双重或多个命名空间会导致宏观卫生究竟是什么?
有人声称 LISP 中的单个命名空间会导致宏不卫生。 http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
拥有单一、双重或多个命名空间会导致宏观卫生究竟是什么?
Lisp-2 意味着你有两个命名空间:一个用于函数,一个用于其他东西。
这意味着您不太可能在不知不觉中重新绑定宏中的函数值(或 var 值)。
在 Lisp-1 中,由于只有一个命名空间,因此(从统计上,但实际上并非如此)您命中现有定义的可能性是其两倍。
实际上,Lisp-1 的卫生内容涵盖了诸如gensym
Scheme 的大量令人困惑的宏之syntax-structure
类的东西,这些宏可以使事物保持卫生。
据我所知,这个问题主要是一个稻草人的论点:它只是在较差或较旧的实现中的一个问题。
Clojure 通过gensym
或 reader 宏myvar#
(#
本质上是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#
。