孟岩

孟岩ID:myan
[修改头像]
1560346次访问,排名6好友1人,关注者32
总是在思考存在的问题
myan的文章
原创 146 篇
翻译 0 篇
转载 3 篇
评论 5202 篇
最近评论
zfbp:现在成都的状况比较稳定了,已经有很多企业开始上班了。汶川、都江堰还是比较恼火。
jieao111:Kevin在成都啊,,以前记得在c/c++版抢过一同分,,bless!
YuLimin:我当时也在成都,大家都来尽一份力量吧!!!
sxbluebird:我老家后山有棵老苹果树很时尚,谁能看见?我公司桌面上有台PC很时尚,公交车上哪个mm会暗送给我秋天的菠菜?


这个话,说的太经典了。 人人都能懂, 这才是哲理。
Terry001:成都地震发生的时候,我正在午睡,我一般睡的会很死,房子把我摇晃醒了,太恐怖了,结果没穿衣服就冲下了楼,搞的甚是狼狈,从来没想到此生也有裸奔的时候。
直到现在,心情都没稳定下来,不过比512好多了,但是还是很担心余震,现在做在家里上网心都是虚的。成都今天不知道从那里报出的消息要缺水了,结果超市的饮用水一强而空。
目前感觉头脑是昏的,时不时会感觉在晃。目前待在成都似乎是一种折……
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes
文章分类
收藏
    相册
    测试
    友情链接
    老赵的博客
    存档

    原创 Ruby中的Continuation

    新一篇: 《程序员》2005年3月文章——几分欣慰,一声叹息(书评)

    下午gigix给我大致讲了一点continuation的东西,说实话我还没有很好的理解。也

    许透彻理解需要熟悉Lisp。不过我记得Ruby里有continuation。Ruby我略知一二,

    所以查了查相关资料。

    Ruby中的Continuation是通过callcc/call函数以及Continuation类实现的。这里举一

    个比较有说服力的程序例子(来自Programming Ruby 2/e)

    def strange
        callcc { |cont| return cont }
        print "Back in method, "
    end

    print "Before method. "
    c = strange()
    print "After method. "
    c.call if c

    这个例子的输出是:
    Before method. After method. Back in method, After method.

    让我来解释一下。callcc是Ruby里的“伪全局函数”(实际上属于Kernel类, Kernel类

    在所有的Ruby程序里缺省地被require & include)。callcc的意思是“call with

    current continuation”。这其中的continuation是什么意思呢?其实就是指一个这

    样的对象,它创建时存储了必要且充分的当前程序运行状态信息,有了这些信息

    ,程序可以在之后的某一个时刻完全回到continuation对象创建时的状态。

    上面的函数strange中,首先调用了callcc函数。这个函数在内部产生了一

    个continuation对象,并且把这个对象作为实际参数传给其后由花括号括起的这个

    block:

    { |cont| return cont }

    在这个block里,形参cont实际上就是callcc内部产生的那个continuation对象。这

    个block很简单地将continuation返回。注意此时返回的这个continuation对象中包

    含了当前程序执行状态的全部信息。

    在程序正文中,strange返回的contiuation对象被保存在c对象中。程序正为最后一

    句调用c.call if c时,由于c并不是nil,所以c.call得到执行。这一执行就使得整个程

    序回到了strange函数生成continuation对象(即callcc调用)时,于是紧跟着执行

    后面的print语句。

    C语言比较熟的人一定会联想起setjmp/longjmp。不过据说这只是实现了一种叫做escape continuation的功能,距离continuation还有一定差距。


    发表于 @ 2005年08月09日 22:59:00|评论(loading...)|编辑

    旧一篇: Ruby on Rails之父获得Google/O'Reilly 2005年度Best Hacker

    评论

    #eh92 发表于2005-11-16 16:57:00  IP: 210.21.212.*
    这个写法怎么和 python 的 yield 有点像呢
    需要把主程序写成一个函数,不够随意
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 孟岩