鱼C论坛

 找回密码
 立即注册
查看: 2599|回复: 0

[技术交流] continuation的理解

[复制链接]
发表于 2015-2-8 15:26:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
由于鱼C没有函数式编程板块,所以只好找了一个支持函数式编程的语言版块来发咯 =-=
这两天重拾了scheme这门教学语言,又复习了一下continuation这个终极奥义,由于上次自己实现了一个scheme的解释器,所以这次对continuation这个东西的理解也更深了一点,写下来,动动手,就当作笔记了

call/cc全程call current continuation ,意思就是调用当前下文(网上大多翻译为连续或者延续,继续等,个人觉得不够确切),那这个东西有什么用呢? 用玩游戏的话说就是存档,把程序当前运行状态保存下来,以后什么时候想回来了,就回到原地继续运行。这个看起来类似于函数调用,就是保存返回地址,call其他函数,然后返回继续执行。呵呵,没那么简单,call/cc还可以在将来任意时候回来,函数调用行吗?大概是不行。
废话少说,放码出来:
(+ 1  (call/cc (lambda (k) (k 1))))


如果您没学过lisp系语言,可能会看不懂,没关系,很好学的,半个小时就能把lisp语法全学会了。

说回这段代码,先不管后面那一坨,大概就是把1和那一坨加起来作为返回值。现在看一下那一坨,call/cc的作用就是捕获到当前下文,然后赋值给后面的lambda表达式的参数k,再把k应用到1。是不是有点不知道在干嘛,没事,马上就揭晓答案,这个表达式的值就是2,也就是1+1.
    为什么呢? 刚才说到下文,那么这个表达式在 + 1 后面的下文是什么呢?没错,就是把后面那一坨表达式的值和1加起来,所以先求值后面那一坨,刚进去就与到call/cc,就捕获到了下文,然后把1作为参数传给k,就是把1作为后面这一坨的值,当然最后结果就是2啦。

   表面上大概就是这样,具体的原理要涉及到scheme求值器的设计,continuation寄存器和exp寄存器的值,如果有人感兴趣,在复习复习这个解释器的实现过程。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 20:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表