方案宏有哪些优点?

时间:2010-08-14 16:03:14

标签: macros lisp scheme common-lisp

为什么有人会更喜欢Scheme宏而不是Common Lisp宏(我真的也想知道,我不是想成为一个巨魔)?

我作为Lisp newb的经验是,Common Lisp样式宏比Scheme的宏更容易学习。我还没有看到Scheme的宏有任何优点,但当然这并不意味着它们不存在。

我知道Scheme宏是“hygenic”,但我仍然不相信这是值得的额外复杂性。另一方面,显然的人确信这是必要的,否则Common Lisp中不会实现Scheme宏。

长话短说,有人可以向我捍卫Scheme的宏吗?

3 个答案:

答案 0 :(得分:18)

Scheme宏引入了两个基本上正交的概念:卫生和模式匹配。在Common Lisp这样的lisp2中,卫生并不那么重要。模式匹配语言捕获了许多常见的宏习语,但问题在于它本质上是一种与方案不同的语言。可能对方案宏的最佳介绍,以及它们背后的一些基本原理是Shriram Krishnamurthi的PLAI第36和37章。

我怀疑人们在普通的lisp中编写方案式宏系统的原因更多的是模式匹配而不是卫生。

答案 1 :(得分:7)

因为它们使用不同的非Scheme语言,所以Scheme几乎不像Common Lisp宏那样强大:你可以用它们进行任意的编译时计算,但它是毛茸茸的,令人费解的。这与不使用set!的论点非常相似:功能较弱的set!免费语言产生较少的错误代码以换取状态的笨拙处理。每当你为纪律交易权力时,你都认为从长远来看你将能够构建更复杂的系统。

这是我在Scheme Lisp上看到的最好的参数:如果你在Scheme之上构建一个复杂的语言,如果你坚持使用标准宏系统,你就不太可能引入微妙的宏bug。 / p>

就个人而言,我不使用宏构建大型语言,所以我更喜欢Common Lisp宏。我发现它们对于小型工作更容易,并且避免变量捕获等在小范围内并不是一件大事。

答案 2 :(得分:4)

Scheme宏保留referential transparency

引用“Guile参考手册”6.10.2.2卫生:

  

syntax-rules macros(..)保留引用透明性。当你   读取宏定义,解析该宏中的任何自由绑定   相对于宏定义;当你读一个宏   实例化时,解析该表达式中的所有自由绑定   相对于表达。

     

这个属性有时被称为卫生,它确实有助于代码   清洁。在您的宏定义中,您可以随意介绍   临时变量,无需担心无意中引入   绑定到宏扩展。

标准方案提供syntax-rulessyntax-case