经验丰富的策士的get-第一,取得下一个,和蹒跚功能(Seasoned Schemer's

2019-09-18 03:45发布

(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-firstget-next ,和waddle (过去两年在这里没有定义)的程序,显然是模拟协同程序通过传递给遍历waddle国债收益率只有离开。 只是之前waddle的在其第二个到最后再入屈服,它集再入点的地方将只返回纯值'()即代替屈服'() 实际值 waddle '()就好像它一直是一个纯函数。

考虑到这一点,我们可以看到什么get-first组起来......当waddle返回“真正的”,这将是内部的call/ccget-first ,然后(leave (quote ()))是值中get-first (,反过来,这个leave打算返回get-next的最后一次迭代,因此它get-next该做的“实际”收益'()

那么,为什么是第二个版本不等同,其中waddle “的价值'()将是参数leave

Answer 1:

这种混乱是因为“ leave ”不是我希望它的功能,但它的功能评估时,它的评估,这似乎是左到右,因此前“到waddle ”。 这意味着它的计算结果为它只是设定为,在声明之前。

寓意:使用受重新定义内调用该函数的功能时要小心! 如果这是一个从右到左的解释, waddle符号之前,将评估leave被查找的功能是“叶子”到哪里,在此期间,它将被设置为不同的功能。



文章来源: Seasoned Schemer's get-first, get-next, and waddle functions