在书籍《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
时,恢复的 continuation 具有原始 continuation 的 r
和 n
,它们的值由两个 set!
应用程序未改变。因此,整个循环将永远不会终止。这个例子中的书写有误吗?或者是我漏掉了什么?
set!
会改变绑定的值,因此所有封闭在这些绑定上的作用域都会看到set!
的结果。 - Alexis King(define (over-x) (let ((x 42)) (lambda () (set! x (+ 1 x)) x)))
),你可以继续调用结果并获得更大的数字。这意味着无论x
的存储位置在哪里,它所在的环境在over-x
返回后必须被保留,因为lambda函数对其进行了封闭。 - Joshua Taylor