SICP 全笔记

这一节深入了一种 CPS(continuation passing style),使用 CPS 来实现求值器的非确定性计算。

理解这个求值器,可以对比 analyze-definition

; amb
(define (analyze-definition exp)
  (let ((var (definition-variable exp))
        (vproc (analyze (definition-value exp))))
    (lambda (env succeed fail)
      (vproc env
             (lambda (val fail2)
               (define-variable! var val env)
               (succeed 'ok fail2))
             fail))))

; normal
(define (analyze-definition exp)
  (let ((var (definition-variable exp))
        (vproc (analyze (definition-value exp))))
    (lambda (env)
      (define-variable! var (vproc env) env)
      'ok)))

除了 lambda 增加了两个参数之外的区别,最大的区别就是 normal 中调用 define-variable! 与其参数的求值过程被分离了–我们知道 scheme 中先对参数求值,再对 define-variable! 求值,但 amb 中一定要显示地表示出来,把这样的 control 掌握在自己手中,这样才能实现自由地掌控 succeed 与 fail 到底去做什么事情。