Compiler construction Lisp/Clojure DSL的函数与符号
我在Clojure中创建了一个DSL,可以选择: a) 以符号形式表示DSL,可在以后转换为AST:Compiler construction Lisp/Clojure DSL的函数与符号,compiler-construction,clojure,lisp,dsl,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 是否有充分的理由选择一种方法而不是另一种方法?看起来方法a)更灵活,因为解析器将解析s表达式,并且基本上可以在表达式树中前后移动以生成所需的代码,例
'(foo (bar (baz 1) (boo 3)))
b) 将DSL表示为生成AST节点的纯函数:
(foo (bar (baz 1) (boo 3)))
=> [AST with foo at top level]
随后将汇编AST
是否有充分的理由选择一种方法而不是另一种方法?看起来方法a)更灵活,因为解析器将解析s表达式,并且基本上可以在表达式树中前后移动以生成所需的代码,例如:在解析foo的子级时,解析器可以回溯到foo,也可以是而在b)方法中,DSL是正常的函数调用,所以boo调用不知道它的父函数等等,因此在这种情况下不能应用回溯
就复杂性而言——a)方法虽然灵活,但可能有点复杂,特别是在实施回溯的情况下,而b)方法应该易于实施,我想这取决于您希望DSL用户如何准确地使用它。在这种情况下,我将从结尾开始,即通过举一些例子来设想DSL的使用或外观