我正在尝试编写一个基于SICP中的元循环计算器的玩具python方案解释器。因为python只支持有限深度的调用堆栈,所以我必须消除尾部调用。我读了一些关于trampolines的文章,并用它实现了解析器。
但我不知道如何以连续传递的方式编写分析器/计算器函数,以便将它们与trampolines一起使用。例如,eval-if函数:
(define (eval-if expr env)
(if (is-true? (eval (if-predicate expr) env))
(eval (if-consequent expr) env)
(eval (if-alternate expr) env)))在python中:
def eval_if(expr, env):
if is_true(eval(if_predicate(expr), env)):
return eval(if_consequent(expr), env)
else:
return eval(if_alternate(expr), env)当我想要检查谓词是否为真时,我必须对其调用新一轮的eval。如何以CPS的形式编写这种递归调用?
发布于 2012-02-15 15:33:07
在方案/球拍中,可以将此函数的CPSed格式编写为:
;; evaluate an 'if':
(define (eval-if expr env k)
(eval (if-predicate expr) env
(lambda (testval)
(if (is-true? testval)
(eval (if-consequent expr) env k)
(eval (if-alternate expr) env k)))))请注意,这假设您的'eval‘也是用CPS编写的。在Python中,如果Guido允许的话,您大概可以使用"lambda“;否则,我相信您可以为此定义一个内部函数。
https://stackoverflow.com/questions/9288385
复制相似问题