一些人声称,LISP中的单个名称空间会导致不卫生的宏。http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
拥有单个、双或多个名称空间导致宏观卫生的确切原因是什么?
发布于 2010-08-16 07:05:21
Lisp-2意味着您有两个名称空间:一个用于函数,另一个用于其他东西。
这意味着您不太可能在不知情的情况下在宏中重新绑定函数值(或var值)。
在Lisp-1中,因为只有一个名称空间,所以命中现有定义的可能性(从统计上讲,但实际上不是)是原来的两倍。
实际上,Lisp-1的卫生特性被诸如gensym和Scheme的大量令人困惑的syntax-structure-like宏之类的东西所覆盖,这些宏可以保持卫生。
据我所知,这个问题主要是一个稻草人的争论:它只是一个较差或较旧的实现中的问题。
Clojure通过gensym或阅读器宏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#吧。
https://stackoverflow.com/questions/3487417
复制相似问题