【发布时间】:2016-03-21 19:48:21
【问题描述】:
我使用球拍,我得到了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。
其次,因为我在internet 中找到了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)) 为了返回上面代码的结果值,我在racket中执行了上面。
但是,上面的代码(由我修改)没有执行并产生错误:
> application: not a procedure; > > expected a procedure that can be applied to arguments > > given: 4 > > arguments...: > > 3
请问我做错了什么。我混淆了延续的概念。谢谢。
【问题讨论】:
标签: scheme racket evaluation continuations callcc