这一节深入了一种 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 到底去做什么事情。