compiler-construction - Lisp/Clojure 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 表达式,并且基本上可以在表达式树中前后移动以生成 ex 所需的代码:同时解析 foo 的子级解析器可以回溯到 foo 或者可能是 foo 的父级以获取一些其他所需的信息等。而在 b) 方法中 DSL 是正常的函数调用所以 boo 调用不知道它的父级等等因此你不能应用回溯在这种情况下。

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

关于compiler-construction - Lisp/Clojure DSL 的函数与符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10792961/

相关文章:

c++ - 在 C++ 程序中使用 C 头文件

compiler-construction - Go1 编译器是如何工作的?

loops - Clojure:当当前变量的值与我的输入值匹配时,我如何让 for 循环停止?

macros - 具有无限数量参数的 Racket 宏

lisp - UVa 10120 礼物?!在 Common Lisp 中?

tree - 在 lisp 中创建一棵树

c# - 是否可以消除 using 声明中冲突的类型名称的歧义?

java - 在 block 中连续使用相同的方法会重新计算该方法吗?

regex - 将集合转换为 clojure 中的正则表达式模式

Clojure - 将列表元素视为函数参数