【发布时间】:2015-04-13 20:28:10
【问题描述】:
Lisp in Small Pieces一书中,有如下示例代码,旨在演示call/cc可以模拟goto。
(define (fact n)
(let ((r 1) (k 'void))
(call/cc (lambda (c) (set! k c) 'void))
(set! r (* r n))
(set! n (- n 1))
(if (= n 1) r (k 'recurse))))
但是,我不确定我是否误解了某些东西,但我看不出这是 call/cc 模拟 goto 的方式。在最后一行应用k 时,恢复的延续具有原始延续的r 和n,其值不被两个set! 应用程序更改。所以整个循环永远不会终止。
这个例子中的书错了吗?还是我错过了什么?
【问题讨论】:
标签: scheme lisp continuations callcc