【问题标题】:Implementing scheme style macros in clojure在 clojure 中实现方案样式宏
【发布时间】:2014-07-09 22:48:42
【问题描述】:

我经常阅读关于为什么 hygenic 宏更好以及 clojure 的宏系统基于 Common Lisp 而不是 hygenic 的争论。

我的问题是:能否在 clojure 中实现方案风格的宏系统,以及在其他 lisps 中植入方案风格的宏的一些示例。

【问题讨论】:

  • 对于投票以“过于宽泛”而关闭此内容的人,我不同意。它不仅询问某事是否可能,还询问正在实施的事情的示例。这是一个可以具体回答的具体问题(正如我试图做的那样)。

标签: clojure scheme


【解决方案1】:

“方案风格的宏系统”,我不确定你是指syntax-rules(简单的模式风格系统)还是syntax-case(更灵活的系统,与datum->syntax一起,实际上确实让你弯腰或完全打破卫生)。

此外,Racket 有 syntax-parse,它比 syntax-case 更易于使用,并且(除其他外)使编写提供可理解错误消息的宏变得愉快。

不管你指的是哪个,都有一个Clojure project that purports to implement aspects of all three。但是我还没有尝试过,我无法保证它的成功程度。

【讨论】:

  • 谢谢 Greg,所以如果两种语言都可以存在于一种语言中,那么为什么人们会如此专注于一种语言而不是另一种呢?
  • @zcaudate 鉴于您有一个不卫生的define-macro,您可以轻松地用它制作任何其他宏系统。使用 Schemes syntax-rules 只有标准(R5RS 和 R7RS-small),您不能。卫生几乎是一种减少错误的抽象,有些人想要它而不是权力。大多数实现两者都有。
【解决方案2】:

我不确定说 Clojure 的宏系统不卫生是否准确。我看到的一个类似讨论提到 common lisp 的阅读器宏系统(Clojure 没有)不卫生,因为它们缺乏防止不同模块中的阅读器宏相互替换的机制。构建语言以使 Scheme 样式的宏不包括在内,这是一个明确且有意的设计决策。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    相关资源
    最近更新 更多