终于明白了Scheme中的continuation和call/cc

在这个问题上耗了超多的时间,所谓功夫不负有心人,终于明白了,豁然开朗的感觉真是爽啊。

关于二叉树匹配问题的理解2014_8_23

因为Scheme没有break continue之类的关键字,所以当需要此类概念时,问题就要通过call/cc解决。

tree-walker-generator函数一开始为caller变量绑定了一个值,为generate-leaves绑定了一个函数(因为需要使用递归所以要用letrec)。然后返回一个函数,王垠文章中把它叫做walker1,在walker1中为caller设定值为k(current continuation),然后调用generate-leaves。generate-leaves的核心部分是else部分,此处所做的就是简单返回当前结点(能进入else分支的必定是叶子节点),(caller tree),为什么tree反而成为一个节点了?因为每次let都给tree绑定了新值,仅此而已。(注意命名let概念,相当于letrec,给let表达式取了一个名字,就可以使用递归了),在else部分还给generate-leaves绑定了新值,(lambda()(rest-of-tree 'resume)),是给generate-leaves绑定loop的continuation,以便下一次调用返回到loop中继续执行,所以不会重新遍历tree。
所以说continuation还真是神奇,绑定的是函数的接下来的动作,使函数在上次中断处重新开始执行。每次调用(k x)后都会强制返回,退出整个函数,从而达到每次获取部分值的能力,且不需重新遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值