为什么有人会更喜欢Scheme宏而不是Common Lisp宏(我真的也想知道,我不是想成为一个巨魔)?
我作为Lisp newb的经验是,Common Lisp样式宏比Scheme的宏更容易学习。我还没有看到Scheme的宏有任何优点,但当然这并不意味着它们不存在。
我知道Scheme宏是“hygenic”,但我仍然不相信这是值得的额外复杂性。另一方面,显然是的人确信这是必要的,否则Common Lisp中不会实现Scheme宏。
长话短说,有人可以向我捍卫Scheme的宏吗?
答案 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-rules
和syntax-case
。