Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction Lisp/Clojure DSL的函数与符号_Compiler Construction_Clojure_Lisp_Dsl - Fatal编程技术网

Compiler construction Lisp/Clojure DSL的函数与符号

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表达式,并且基本上可以在表达式树中前后移动以生成所需的代码,例

我在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的子级时,解析器可以回溯到foo,也可以是而在b)方法中,DSL是正常的函数调用,所以boo调用不知道它的父函数等等,因此在这种情况下不能应用回溯


就复杂性而言——a)方法虽然灵活,但可能有点复杂,特别是在实施回溯的情况下,而b)方法应该易于实施,

我想这取决于您希望DSL用户如何准确地使用它。在这种情况下,我将从结尾开始,即通过举一些例子来设想DSL的使用或外观