gpt4 book ai didi

python - 将声明式 DSL 转换为嵌套函数调用

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:00 27 4
gpt4 key购买 nike

我有一个 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

将导致以下嵌套函数调用:

visit(
sequence(
do_action1(),
do_action2(),
select(
do_action3(),
sequence(
do_action4(),
do_action5(),
),
do_action6(),
)
)
)

我无法准确想象如何做到这一点。因为 DSL 必须代表一棵树,所以简单的深度优先遍历似乎是合适的。但是为了构建嵌套的函数调用,我必须以某种方式将其翻转过来。它可能涉及一些巧妙的中间堆栈或类似的东西,但我不太明白。执行此转换的正确方法是什么?

最佳答案

我认为您可以让 python 跟踪函数调用和参数,而不用自己使用堆栈来跟踪。

假设您有一个 YAML 解析树,其中每个节点代表一个函数调用,该节点的每个子节点都是一个参数(这也是一个函数调用,因此它可能有自己的参数)。

然后定义函数evaluate,对这棵树的一个节点求值,如下(伪代码):

def evaluate(node):
# evaluate parameters of the call
params = []
for child in node:
params.append(evaluate(child))

# now make the call to whatever function this node represents,
# passing the parameters
return node.function.call(*params)

最后,调用 evaluate 并将 YAML 树的根作为参数传递,您应该会获得所需的行为。


稍微不同的 eval-apply 结构

def evaluate(node):
# evaluate parameters of the call
params = [ evaluate(child) for child in node ]

# apply whatever function this node represents
return node.function.call(*params)

关于python - 将声明式 DSL 转换为嵌套函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7354958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com