我使用球拍,我得到了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
请问我做错了什么。我混淆了延续的概念。谢谢。