如何在CPS表单中编写分析/评估函数,如`eval-if`?

时间:2012-02-15 05:37:26

标签: scheme sicp continuation-passing trampolines

我正在尝试根据SICP中的元循环评估程序编写一个玩具python Scheme解释器。由于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形式编写这种递归调用?

1 个答案:

答案 0 :(得分:3)

在scheme / Racket中,您将此函数的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”;否则,我相信你可以为此定义一个内部函数。