首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单个名称空间会导致不卫生的宏是什么?(在LISP中)

单个名称空间会导致不卫生的宏是什么?(在LISP中)
EN

Stack Overflow用户
提问于 2010-08-15 20:49:54
回答 1查看 1.1K关注 0票数 8

一些人声称,LISP中的单个名称空间会导致不卫生的宏。http://community.schemewiki.org/?hygiene-versus-gensym

http://www.nhplace.com/kent/Papers/Technical-Issues.html

拥有单个、双或多个名称空间导致宏观卫生的确切原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-16 07:05:21

Lisp-2意味着您有两个名称空间:一个用于函数,另一个用于其他东西。

这意味着您不太可能在不知情的情况下在宏中重新绑定函数值(或var值)。

在Lisp-1中,因为只有一个名称空间,所以命中现有定义的可能性(从统计上讲,但实际上不是)是原来的两倍。

实际上,Lisp-1的卫生特性被诸如gensym和Scheme的大量令人困惑的syntax-structure-like宏之类的东西所覆盖,这些宏可以保持卫生。

据我所知,这个问题主要是一个稻草人的争论:它只是一个较差或较旧的实现中的问题。

Clojure通过gensym或阅读器宏myvar# ( #本质上就是gensym)提供卫生的宏。

您也不必担心在宏中重新绑定函数的局部作用域: Clojure是完全干净的:

代码语言:javascript
复制
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)

下面是一些可变的卫生条件:

代码语言:javascript
复制
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#吧。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3487417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档