【发布时间】:2014-03-01 05:33:58
【问题描述】:
在文章 Technical Issues of Separation in Function Cells and Value Cells 中,Kent Pitman 和 Richard Gabriel 解释了将 Common Lisp 制作为 Lisp-2 的决定:
有两种方法可以查看有关宏和命名空间的参数。首先是单个命名空间具有根本重要性,因此宏是有问题的。第二个是宏是基础,因此单个命名空间是有问题的。
据此,在进行宏编程时,宏编程中的单一命名空间本质上是有问题的。
但 Clojure 的方法有点不同:反引号进行命名空间解析。
在 On Lisp 一书的第 9 章中,Paul Graham 谈到了通过在包中分离代码来避免变量捕获:
但是,包并没有为问题提供非常通用的解决方案 捕获。首先,宏是某些程序不可分割的一部分,它 将它们分开放在自己的包装中会很不方便。第二, 这种方法不能防止被宏中的其他代码捕获 包。
据我所知,Clojure 的变量捕获解决方案看起来像 Paul Graham 展示的打包选项。
Paul Graham 指出的主要缺点之一是在不同的包中分隔宏会很不方便,但 Clojure 的反引号会自动通过添加符号的命名空间来做到这一点,对吧?
那么,它是一个完整的变量捕获解决方案吗?还是肯特·皮特曼的话仍然适用?如果 Common Lisp 的分隔命名空间可以处理 Clojure 不能处理的任何问题,你能写一个例子吗?
【问题讨论】:
-
Stuart Halloway 发表了一系列文章,将 On Lisp 示例翻译成 Clojure 并附有评论。他的article covering Chapter 9 应该会回答你的一些问题。
-
请使用 stackoverflow 解决您面临的实际问题。最好有代码。 Stackoverflow 不用于讨论一般哲学问题。还有其他网站。
标签: macros clojure common-lisp