我使用球拍,我得到了4
以下简单代码的结果:
(let/cc done
((let/cc esc
(done (+ 1 (let/cc k
(esc k)))))
3))
我打算一步一步地执行这段代码。
首先,我将第一个更改let/cc
为如下形式call/cc
:
(call/cc (λ (done)
((let/cc esc
(done (+ 1 (let/cc k
(esc k)))))
3)))
当然,这4
也产生了。
其次,因为我call/cc
在互联网上找到了说call/cc
做以下4个步骤的机制:
- 捕获当前的延续。
- 构造一个
C
接受一个参数的函数,并使用该参数值应用当前延续。 - 将此函数作为参数传递给
expr
--- 即,它调用(expr C)
. - 返回评估的结果
(expr C)
,除非expr
调用C
,在这种情况下C
返回传递给的值。
因此,我首先按照上述步骤进行call/cc
操作:
- 当前的延续是一种身份。
C
指(λ (x) x)
.由于
expr
是(λ (done) ((let/cc esc (done (+ 1 (let/cc k (esc k))))) 3))
,(expr C)
是:((λ (done) ((let/cc esc (done (+ 1 (let/cc k (esc k))))) 3)) (λ (x) x))
为了返回上面代码的结果值,我在上面执行了球拍。
但是,上面的代码(由我修改)没有执行并产生错误:
> application: not a procedure; > > expected a procedure that can be applied to arguments > > given: 4 > > arguments...: > > 3
请问我做错了什么。我混淆了延续的概念。谢谢。