3

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

是否有充分的理由偏爱一种方法而不是另一种方法?

4

1 回答 1

5

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

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

于 2012-05-29T04:23:45.943 回答