(define get-first
(lambda (l)
(call-with-current-continuation
(lambda (here)
(set! leave here)
(waddle l)
(leave (quote ()))))))
(define get-first
(lambda (l)
(call-with-current-continuation
(lambda (here)
(set! leave here)
(leave (waddle l))))))
对于任何不熟悉《老练的阴谋家》这本书的人来说,get-first
, get-next
, and waddle
(最后两个此处未定义)是显然建模的过程协程迭代tree传递给waddle
只产生叶子。就在之前waddle
的第二次重新进入时的收益,它将重新进入点设置为仅返回纯值的位置'()
即而不是屈服'()
, the 实际价值 of waddle
is '()
,就好像它一直是一个纯函数一样。
考虑到这一点,我们可以看到什么get-first
设置...时waddle
返回“for real”,它将位于call/cc
in get-first
进而(leave (quote ()))
的值是get-first
(反过来,这个leave
旨在返回get-next
在最后一次迭代中,因此它是get-next
这确实是“实际”返回'()
).
那么为什么第二个版本不等效,其中waddle
的值是'()
将是论据leave
?
混乱是因为“leave
" 不是我想要的函数,而是它求值的函数when它被评估,它似乎是从左到右,因此在“waddle
“。这意味着它的计算结果是之前声明中刚刚设置的值。
道德:当使用需要在函数调用内重新定义的函数时要小心!如果这是从右到左的解释器,waddle
将在符号之前评估leave
被查找为“离开”到任何地方的函数,在此期间它将被设置为不同的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)