将Clojure宏用于DSL

Zub*_*air 11 macros dsl clojure higher-order-functions

我正在开发一个Clojure项目,我经常发现自己正在为DSL编写Clojure宏,但我正在观看Clojure视频,了解公司如何在实际工作中使用Clojure,而且发言人说在实际使用中他们不使用宏来实现他们的DSL,他们只使用宏来添加一点句法.这是否意味着我应该使用标准函数编写我的DSL,然后在最后添加一些宏?

更新:在阅读了这个问题的许多不同(和有趣的)回答后,我意识到答案并不像我最初想的那样明确,原因有很多:

  1. 应用程序中有许多不同类型的API(内部,外部)

  2. API的用户有很多种类(商业用户只想快速完成某项工作,Clojure专家)

  3. 是否有宏隐藏锅炉板代码?

我会离开并更深入地思考这个问题,但感谢你的回答,因为他们给了我很多思考.另外我注意到Paul Graham认为与Christophe视频相反,并认为宏应该是代码库的很大一部分(25%):

http://www.paulgraham.com/avg.html

mik*_*era 12

在某种程度上,我认为这取决于您的DSL的用途/目的.

如果您正在编写类似于库的DSL以在Clojure代码中使用并希望以功能方式使用它,那么我更喜欢基于宏的函数.函数对于Clojure用户来说是"不错的",因为它们可以动态组合成更高阶的函数等.例如,您正在编写像Ring这样的功能性Web框架.

如果您正在编写一个命令式的DSL,它将独立于其他Clojure代码使用,并且您已经确定您绝对不需要更高阶的函数,那么使用情况将非常相似,您可以选择哪个最有意义.例如,您可能正在创建某种业务规则引擎.

如果您正在编写需要生成高性能代码专用DSL,那么您可能希望在大多数时间使用宏,因为它们将在编译时进行扩展以实现最高效率.例如,您正在编写一些需要扩展到完全正确的OpenGL调用序列的图形代码......


nic*_*kik 7

是!

尽可能编写函数.当函数执行时,永远不要编写宏.如果你写了许多宏,你最终会得到更难扩展的东西.例如,宏不能应用或传递.

Christophe Grand :(不是= DSL宏)

http://clojure.blip.tv/file/4522250/

  • @nickik,Christophe提出的主要观点是"编写DSL很难*(至少*为他*)".选择高阶函数而不是AST变换的论证还不够 - 这只是表明*他*完全以错误的方式完成它.实际上,绝大多数Clojure社区都是以错误的方式进行,试图实现复杂的单片宏而不是简单的变换链. (2认同)