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