zoukankan      html  css  js  c++  java
  • 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)
    ()

  • 相关阅读:
    VIM文本替换命令
    VIM格式化代码(How to format code with VIM)
    字符串匹配的Boyer-Moore算法
    Java中数组的遍历
    UVa10723
    uva242,Stamps and Envelope Size
    UVa1630,Folding
    uva1629,Cake Slicing,记忆化搜索
    uva 10118,记忆化搜索
    uva10003
  • 原文地址:https://www.cnblogs.com/sniperHW/p/3115961.html
Copyright © 2011-2022 走看看