在文章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的separeted命名空间可以处理Clojure无法处理的任何问题,你能写下一个例子吗?
答案 0 :(得分:1)
我从未遇到过Clojure宏系统的限制。它是一个完全通用的宏系统,据我所知,它在基本功能方面与Common Lisp完全相同。
显然存在许多语法上的差异,但我认为它们大多是肤浅的,不会影响你用宏实现的表现力。
我认为Clojure在这里有很多设计方面:
作为最终评论,链接文章的摘要非常有启发性:
大量关注清洁语义和符号的论点 简单倾向于支持联合功能和值命名空间.....我们觉得时间到了 Common Lisp的这种彻底改变已经过去了,这将是它的工作 未来的Lisp设计师将从Common Lisp和Scheme中吸取教训 产生改进的Lisp。
在我的拙见中 - Clojure是“改进的Lisp”的一个很好的例子。