Lisp/Clojure DSL的函数与符号

mik*_*era 3 lisp compiler-construction dsl clojure

我在Clojure中创建了一个DSL,可以选择:

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

'(foo (bar (baz 1) (boo 3)))
Run Code Online (Sandbox Code Playgroud)

b)将DSL表示为生成AST节点的纯函数:

(foo (bar (baz 1) (boo 3)))
=> [AST with foo at top level]
Run Code Online (Sandbox Code Playgroud)

随后将编译AST.

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

Ank*_*kur 5

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

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