Я думаю, вы могли бы позволить 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)