scheme 学习: continuation(2)

上一篇文章我参考了很多其它文章,自己对continuation也没有完全吃透,本篇继续贴出自己对continuation的

理解,希望大家看完后能理解continuation到底是一个什么东西,当然也希望能得到些反馈,例如看完之后是否能

对continuation有个基本的了解,又或者我的解释有没有什么不对的地方.首先看一下tspl中对continuation的介

绍:

在对scheme表达式求值的过程中,一个scheme实现必须要追踪两样东西:(1)对什么求值(2)对那个值做些什么.考虑

下面表达式中的求值过程(null?x).

(if (null?x) (quote ()) (cdr x))

scheme实现首先要求值(null? x),然后基于求出来的这个值(在这里求出来的值是true或false)决定后面将要调用

(quote ()还是(cdr x).在这里,要求的值就是(null? x),或者说是对(null? x)求值,而后面根据这个值选择到底

是调用(quote ())还是(cdr x)就是对这个值将要做的事.

因此,在计算一个表达式的过程中的任何一个点,都存在着一个准备完成的continuation,或者说,存在一个将计算
继续下去的点.我们假设x有值(a b c),我们可以把对表达是 (if (null?x) (quote ()) (cdr x))的求值分隔成6个
continuations,它们分别在等待:(这段翻译得有点别扭)

1)(if (null? x) (quote ()) (cdr x))被求值

2)(null? x)被求值

3)null?被求值

4)x被求值(在(null? x)中

5)cdr 被求值

6)x被求值((在cdr x)中)

(cdr x)的continuation没有被列出来,因为它跟等待(if (null? x) (quote ()) (cdr x))被求值的continuation
是一样的.(这句不是很理解)

scheme允许我们通过call/cc捕捉任何表达式的continuation.我们必须以一个只有一个参数的过程作为参数调用call/cc,

call/cc把捕捉到的continuation当作参数传递给那个作为call/cc参数的过程.


从上面的介绍,可以了解,在每一个需要被求值的位置,都存在着一个continuation,一但这个位置被求值,或者说
等待到了它需要的值,后续的求值计算就可以continue.例如我们以上面列出的2)和4)举例,用c?表示一个等待求
值的位置来表示一个continuation:

2)(if c? (quote ()) (cdr x))

4)(if (null? c?) (quote ()) (cdr x))

如上面两个例子,整个表达式要想继续求值,首先要等待c?的位置被求值,由此可见一个continuation就是一个表达
式加上一个等待求值的位置,一但给等待位置提供了值,整个表达式就可以被求值了.

根据tspl的描述,我们可以通过call/cc捕获任何位置的continuation,并且可以把这个continuation绑定到某个变量
,在将来的某个时刻,把这个continuation当做一个过程调用,并给它传递一个值作为参数(参数的作用相当与给等待
求值的位置提供一个值)来继续求值它所代表的求值表达式.

下面看一个例子:

(define c #f)

(define (test2 x)
    (if 
        (call/cc (lambda (k)
            (set! c k) #t))    
        (quote ()) (cdr x))
)

call/cc所捕捉到的continuation相当于下面这样:

(define (test2 x)
    (if c? (quote ()) (cdr x))
)

下面在提示符下输入下面代码:
> (test2 '(1 2))
()
> (c #f)
(2)

可以看见,当我们执行(c #f)的时候,表达式继续求值了,并以#f为c?的值,输出了(2).而上面代码中用call/cc捕捉到的

continuation实际上与下面这段代码在效果上是等价的:

(define (create-continuation x)
    (lambda (val)
        (if val (quote ()) (cdr x))    
    ))

> (define c (create-continuation '(1 2)))
> (c #f)
(2)
> (c #t)
()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值