Lisp / Clojure DSL的函数与符号

时间:2012-05-29 04:11:57

标签: compiler-construction clojure lisp dsl

我在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。

是否有任何理由倾向于选择一种方法而不是另一种?

1 个答案:

答案 0 :(得分:5)

看起来方法a)在解析器将解析s表达式的意义上更灵活,并且基本上可以在表达式树中前后移动以生成ex的所需代码:在解析foo的子时解析器可以回溯到foo或者可能是foo的父级来获取其他所需的信息等。而在b)方法中,DSL是正常的函数调用,所以boo调用不知道它的父级等等因此你不能应用回溯在这种情况下。

就复杂性而言 - a)方法虽然灵活但可能有点复杂,特别是如果实施回溯,而方法b)应该易于实现,