|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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寄存器的值,如果有人感兴趣,在复习复习这个解释器的实现过程。
|
|