作者suhorng ( )
看板PLT
标题[问题] call/cc 变数的值 印出的结果应该是?
时间Fri Jan 11 00:45:47 2013
各位好
因为实在搞不懂 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
1F:推 ccshan:有亮白色这段 就等於有两个var "(define y 9) (display y)" 01/11 09:02
2F:→ ccshan:所以结果应该是 1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 9 10 01/11 09:03
3F:→ ccshan:所以总结: scope不受call/cc影响, call/cc如同一般函数. 01/11 09:04
4F:→ suhorng:谢谢!! 所以是他的实做出错了 01/11 11:30
5F:→ suhorng:我也觉得会影响到很奇怪..使用cont的时候应该要把目前的 01/11 11:30
6F:→ suhorng:evaluation context抛弃掉才对@@ 01/11 11:30
7F:→ suhorng:可是我也没有去研究 R^5RS 给的 formal semantics.. 01/11 13:15
阿..还是说那边那个 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)