我听说Clojure宏易于编写,但不如Racket的卫生宏可靠。我的问题分为两部分:
- 如何
gensym
从卫生宏有什么不同? - 球拍宏提供了Clojure不提供的哪些功能?(无论是安全性,可组合性还是其他)
2
卫生宏是保证扩展不会引起标识符意外捕获的宏。在引入卫生宏之前,意外捕获的一般问题在Lisp社区中众所周知。宏编写者将使用会生成唯一标识符(例如gensym)的语言功能,或者使用混淆的标识符来避免该问题。卫生宏是集成到宏扩展器本身中的捕获问题的程序化解决方案。 zh.wikipedia.org/wiki/Hygienic_macro
—
罗伯特·哈维
因为[Racket]卫生宏系统对宏的工作原理有深入的了解,所以您的宏已很好地集成到环境中:语法高亮显示正确,自动变量重命名正确,交叉引用正确,其他所有流畅的[Racket] IDE功能。换句话说,卫生不仅可以保护您免受诸如变量捕获之类的简单错误的侵害,还可以使您的代码通过普通LISP根本不存在的工具进行正式分析。 randomhacks.net/2002/09/13/hygienic-macros
—
罗伯特·哈维