Lisp / Clojure DSL中的函数与符号对比

3

我将在Clojure中创建一种DSL,有两种选择:

a) 以符号形式表示DSL,稍后可以将其转换为AST:

'(foo (bar (baz 1) (boo 3)))
b) 将DSL表示为纯函数来生成AST节点:
(foo (bar (baz 1) (boo 3)))
=> [AST with foo at top level]

然后该AST将被编译。

是否有任何强烈的理由支持一种方法而不是另一种?


我猜这取决于您希望DSL的用户如何使用它。在这种情况下,我会从最终目标开始,即通过采用一些示例来构想DSL的使用方式或外观。 - Ankur
1个回答

5
似乎方案a)更加灵活,因为解析器将解析s表达式,基本上可以在表达式树中前后移动以生成所需的代码。例如:在解析foo的子项时,解析器可以回溯到foo或者可能回溯到foo的父项以获取其他所需信息等。而在b)方法中,DSL是普通的函数调用,因此boo调用不知道其父项等等,因此在这种情况下不能应用回溯。
就复杂性而言,尽管a)方法灵活,但如果实现回溯,则可能会有些复杂,而b)方法应该易于实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接