[問題] call/cc 變數的值 印出的結果應該是?

看板PLT (程式語言與理論)作者 ( )時間12年前 (2013/01/11 00:45), 編輯推噓1(106)
留言7則, 2人參與, 最新討論串1/1
各位好 因為實在搞不懂 call/cc 以及一些環境, scope 的問題, 想要請教一下 (define var 0) (let ((cont ( call/cc (lambda (k) (k k)) ))) (set! var (+ var 1)) (display var) (newline) (cond ((< var 10) (define var 9) (display var) (newline) (cont cont)) (#t #t))) 以上這段程式 到底該輸出什麼呢? 若沒有亮白色那段, 輸出應該就是 1 1 2 2 ... 9 9 10 但是有亮白色這段 還會是這樣嗎? chicken 編譯器跑出來變 1 9 10 @@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.51.251

01/11 09:02, , 1F
有亮白色這段 就等於有兩個var "(define y 9) (display y)"
01/11 09:02, 1F

01/11 09:03, , 2F
所以結果應該是 1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 9 10
01/11 09:03, 2F

01/11 09:04, , 3F
所以總結: scope不受call/cc影響, call/cc如同一般函數.
01/11 09:04, 3F

01/11 11:30, , 4F
謝謝!! 所以是他的實做出錯了
01/11 11:30, 4F

01/11 11:30, , 5F
我也覺得會影響到很奇怪..使用cont的時候應該要把目前的
01/11 11:30, 5F

01/11 11:30, , 6F
evaluation context拋棄掉才對@@
01/11 11:30, 6F

01/11 13:15, , 7F
可是我也沒有去研究 R^5RS 給的 formal semantics..
01/11 13:15, 7F
阿..還是說那邊那個 define 是不合法的...? 對不起, 那個 define 是不合法的... 我想想看有沒有其他改法 ※ 編輯: suhorng 來自: 118.166.51.251 (01/11 13:39) ※ 編輯: suhorng 來自: 118.166.51.251 (01/11 15:26) 新的 code 是這樣 (define var 0) (let ((cont (call/cc (lambda (k) (k k))))) (display var) (newline) (cond ((= var 0) (set! var 1) ((lambda (unused) (define var 2) (display var) (newline) (cont cont) ) #f)) ((= var 1) (display "ok")) (#t (display "shadowed\n")) )) 執行結果很正常...之前真的是我 define 用的不合法 抱歉QQ 不過不知道為什麼一開始的 display var 顯示是 #undefine.. ※ 編輯: suhorng 來自: 118.166.51.251 (01/11 15:40)
文章代碼(AID): #1Gxl0-OQ (PLT)
文章代碼(AID): #1Gxl0-OQ (PLT)