【问题标题】:Does Clojure's single-namespace approach constrains you in any way when programming macros?在编写宏时,Clojure 的单一命名空间方法是否会以任何方式限制您?
【发布时间】: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


【解决方案1】:

我从未遇到过 Clojure 宏系统的限制。它是一个完全通用的宏系统,据我所知,它在基本功能方面与 Common Lisp 完全可比。

显然有很多句法上的差异,但我认为它们大多是肤浅的,并不影响你可以通过宏实现的表达能力。

我的观点是 Clojure 在这里获得了很多设计方面:

  • Lisp-1 比 Lisp-2 更简单,概念上更清晰,尤其是在您实际上需要将函数视为第一类值的函数式语言中。
  • 符号捕获通常不是问题 - Clojure 语法引用和命名空间系统在使宏既可用又可读方面做得很好。

作为最后的评论,链接文章的摘要很有启发性:

大量的论点集中在清晰的语义和符号上 简单倾向于将函数和值命名空间结合起来......我们觉得是时候 对 Common Lisp 进行了如此彻底的改变,这将是 未来的 Lisp 设计师应该从 Common Lisp 和 Scheme 中吸取教训 产生一个改进的 Lisp。

在我看来,Clojure 是“改进的 Lisp”的一个很好的例子。

【讨论】:

  • 第一点是废话,你可以完美地将函数视为 Lisp-n 中的第一类值。但也许你对funcall 有疑问。
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多