我正在 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 表达式,并且基本上可以在表达式树中前后移动以生成 ex 所需的代码:同时解析 foo 的子级解析器可以回溯到 foo 或者可能是 foo 的父级以获取一些其他所需的信息等。而在 b) 方法中 DSL 是正常的函数调用所以 boo 调用不知道它的父级等等因此你不能应用回溯在这种情况下。
就复杂性而言 - a) 方法虽然灵活但可能有点复杂,特别是如果实现回溯,而方法 b) 应该易于实现,
关于compiler-construction - Lisp/Clojure DSL 的函数与符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10792961/