方案宏有哪些优点?

Jas*_*ker 23 lisp macros scheme common-lisp

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

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

我知道Scheme宏是"hygenic",但我仍然不相信这是值得的额外复杂性.在另一方面,虽然,有很明显人是相信,这是必要的,否则就不会有Common Lisp中的宏方案的实现.

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

dei*_*nst 19

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

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


Nat*_*ers 7

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

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

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

  • "方案宏"不会比CL宏强大* - 它只是模式匹配限制的`syntax-rules`功能不强.任意`syntax-case`样式宏与CL宏一样强大,实际上更强大,因为CL宏几乎忽略了词法信息. (5认同)
  • 内森:是的,你的论点对于“语法规则”来说几乎是正式的,我什至会说,如果你谈论的是宏的实际用途,那么论点就更强大。但Scheme *确实*有“syntax-case”,它可以执行任意计算——不需要那些复杂的黑客。 (2认同)