我在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。
是否有任何理由倾向于选择一种方法而不是另一种?
答案 0 :(得分:5)
看起来方法a)在解析器将解析s表达式的意义上更灵活,并且基本上可以在表达式树中前后移动以生成ex的所需代码:在解析foo的子时解析器可以回溯到foo或者可能是foo的父级来获取其他所需的信息等。而在b)方法中,DSL是正常的函数调用,所以boo调用不知道它的父级等等因此你不能应用回溯在这种情况下。
就复杂性而言 - a)方法虽然灵活但可能有点复杂,特别是如果实施回溯,而方法b)应该易于实现,