終於明白了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)後都會強制返回,退出整個函數,從而達到每次獲取部分值的能力,且不需重新遍歷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章