我有一个python库,它用nested function calls构建特殊迭代器(行为树)。虽然API有一个相当好且轻量级的语法(因为它是python),但它确实可以使用声明性DSL。在
下面是我设想的一个粗略的草图:
DSL(使用YAML):
tree:
- sequence:
- do_action1
- do_action2
- select:
- do_action3
- sequence:
- do_action4
- do_action5
- do_action6
将导致以下嵌套函数调用:
^{pr2}$我很难想象到底该怎么做。因为DSL必须表示一棵树,所以简单的深度优先遍历似乎是合适的。但是为了构建嵌套的函数调用,我必须以某种方式把它翻出来。它可能涉及到一些巧妙的中介堆栈或类似的东西,但我不能完全理解它。执行这种转换的正确方法是什么?在
我认为可以让python跟踪函数调用和参数,而不是自己用堆栈来跟踪。在
假设您有一个YAML解析树,其中每个节点代表一个函数调用,而这个节点的每个子节点都是一个参数(这也是一个函数调用,因此它可能有自己的参数)。在
然后定义函数
evaluate
,该函数计算该树的一个节点,如下所示(伪代码):最后,调用
evaluate
,将YAML树的根作为参数传递,您应该得到所需的行为。在略有不同的eval apply结构
^{pr2}$相关问题 更多 >
编程相关推荐