(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))))))
对于不熟悉“The Seasoned Schemer”一书的人,get-first
,get-next
和waddle
(此处未定义的最后两个)是明显模拟协同程序的程序遍历传递给waddle
的树,只产生叶子。就在waddle
从倒数第二次重新进入的收益之前,它将重新进入点设置为仅返回纯值'()
,而不是屈服{{ 1}},'()
的实际值是 waddle
,好像它一直都是纯函数。
考虑到这一点,我们可以看到'()
设置的内容......当get-first
返回“for real”时,它将位于waddle
call/cc
内然后get-first
是(leave (quote ()))
的值(反过来,此get-first
旨在在最后一次迭代时返回leave
,因此它是get-next
那是get-next
的“实际”回报。
那么为什么第二个版本不相同,'()
的{{1}}值将成为waddle
的参数?
答案 0 :(得分:3)
混淆是因为“leave
”不是我想要的功能,而是在评估时评估的功能,它似乎是从左到右因此在“waddle
”之前。这意味着它在之前的声明中评估它刚刚设置的内容。
道德:当使用在函数调用中重新定义的函数时要小心!如果这是一个从右到左的解释器,waddle
将在符号leave
被查找之前被评估为“离开”到任何地方的函数,在此期间它将被设置为不同的功能。