关于call/cc的小问题

By include at 2019-04-27 • 0人收藏 • 260人看过

学习了call-with-current-continuation,阴阳谜题也勉强能够看懂了,今天心血来潮写下了这样的代码 (define x (call/cc (lambda (x) x))) (define y (call/cc x)) 这样一来,当我在解释器中输入(x a)的时候,y的值就变成了a,百思不得其解。延续的延续是个什么东西

3 个回复 | 最后更新于 2019-04-29
2019-04-29   #1
(define x
  (call/cc
   (lambda (k) ; 这里的k是:定义x,然后去top-level
     k)))
     
     
;; (define y
;;   (call/cc x))


;; 和上面的是等价的,但更方便阐述 (但愿我没有搞错 :-p)
(define y
  (call/cc
   (lambda (k) ; 这里的k是:定义y,然后去top-level
     (x k))))  ; 这里发生了什么?把x定义为一个定义y的延续,然后去top-level
     
     
;; y
;; Exception: variable y is not bound
;; y是未定义的,因为上面的表达式中,x做完事情之后去到了top-level,跳过了 define y


;; x现在的作用就是定义y,取个合适的名字就不难理解了
(define def-y x)

(def-y 1)
(write y)

(def-y 2)
(write y)


2019-04-29   #2

回复#1 @qzivli :

2019-04-29   #3

感谢!我看懂了。 我的理解: 一个continuation 可以看作一个函数,它接受一个参数,并返回到对应的call/cc对应的点。

形式上应该可以这样写,但是应该不太严谨: 经过(define x (call/cc (lambda (x) x)))后,x的值可以看作(lambda (arg) ‘take-k-to-where-x-lies) 当写下(define y (call/cc x))时,当前的continuation就被传给了上文中的k,并返回到x的定义,这样一来,x的值就编程的(define y ##) ,##表示y的continuation, 每当用一个值调用x时,y就会被赋予这个值

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...