在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!
。所以整个循环永远不会终止。
这个例子中的书错了吗?还是我错过了什么?