Call cc 如何這樣模擬 Goto?

時間 2021-06-01 09:07:56

1樓:馮東

最近查到了一些資料,所以自問自答吧。

Continuation 的語義是只記錄計算的過程,不保留變數的狀態。對於一般的用 stack 實現的語言,continuation 有兩種實現方法:拷貝 stack 或者把 stack 中被 continuation capture 的部分的引用保留下來。

拷貝 stack 的方式,要求在 stack 上不能直接存 non-boxed 變數。參見 http://

2樓:楊雙成

你的理解錯誤在於沒有摳字眼。

call/cc 捕獲的是當前延續,不是當前環境,也不是當前狀態!

所以恢復的不是當時的環境或狀態,是當時的延續。

要正確理解這個程式,就要分析當前延續。

具體分析當前延續參考call/cc分析一例 就是我之前複製的答案。

3樓:luikore

棧是這樣的:

n <- r <- k <- . <- 剩下的棧變數lt;- call/cc 獲得存檔點

用 set! 改了 n, r 的話, 依然會影響存檔點你可以試試把 (set! r ...) 和 (set! n ...) 改成 let 看看有什麼不同

4樓:

這是個box啊

> (define (f) (let ((a 0)) (lambda () (set! a (+ a 1)) a))

> (let ((x (f))) (x))1> (let ((x (f))) (x) (x))2> (let ((x (f))) (x) (x) (x))3>

如何解釋 Lisp 中 call cc 的概念?

簡單點的理解就是在 call cc 出現的地方搞出乙個蟲洞的出口,而蟲洞的入口是 call cc lambda k中出現的 k 通過 k 的形式將.的求值結果傳送到蟲洞出口的位置,k這個蟲洞入口還可以賦值給別的變數.其它的就交給別的答主了 勃珍妮 補充一下 紅日照小池 池哥的回答,因為看不大懂.定義...

如何從零寫出 人生重開模擬器 這樣的前端專案?

龍騰道默默地 這遊戲只是看起來簡單,玩下去會發現本來就挺複雜的,像搜尋引擎一樣有迷惑性,並不是什麼適合 練手 的專案,尤其不適合技術型練手,因為它重點不是技術。如果你把所有的遊戲邏輯都剔除出去,最後你能練的也就三四個頁面,這毫無意義 飢人谷程式設計 乙個技術老舊的簡單靜態專案能上衝知乎熱榜,雖然有運...

你們玩的模擬人生4也是這樣嗎?

找呀找阿鹿 看了很多回答和我相反 我剛開始入坑的時候還是m2 那個時候最喜歡上帝視角有個m開頭的加錢秘籍需求停止秘籍用得的不亦樂乎 直接到m4過後慢慢喜歡上白手起家在忙碌中看著自己的房子越裝越好房子越住越大錢越來越多 個人覺得上帝視角用多了這個遊戲就很快失去意思了 5210 contrl 空格 sh...