经验丰富的Schemer的先到先得,下一步和蹒跚的功能

时间:2012-06-15 01:52:26

标签: scheme continuations callcc seasoned-schemer

(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-firstget-nextwaddle(此处未定义的最后两个)是明显模拟协同程序的程序遍历传递给waddle,只产生叶子。就在waddle从倒数第二次重新进入的收益之前,它将重新进入点设置为仅返回纯值'(),而不是屈服{{ 1}},'() 实际值 waddle,好像它一直都是纯函数。

考虑到这一点,我们可以看到'()设置的内容......当get-first返回“for real”时,它将位于waddle call/cc内然后get-first(leave (quote ()))的值(反过来,此get-first旨在在最后一次迭代时返回leave,因此它是get-next那是get-next的“实际”回报。

那么为什么第二个版本不相同,'()的{​​{1}}值将成为waddle的参数?

1 个答案:

答案 0 :(得分:3)

混淆是因为“leave”不是我想要的功能,而是在评估时评估的功能,它似乎是从左到右因此在“waddle”之前。这意味着它在之前的声明中评估它刚刚设置的内容。

道德:当使用在函数调用中重新定义的函数时要小心!如果这是一个从右到左的解释器,waddle将在符号leave被查找之前被评估为“离开”到任何地方的函数,在此期间它将被设置为不同的功能。