在这个问题上耗了超多的时间,所谓功夫不负有心人,终于明白了,豁然开朗的感觉真是爽啊。
关于二叉树匹配问题的理解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)后都会强制返回,退出整个函数,从而达到每次获取部分值的能力,且不需重新遍历。