【发布时间】:2012-06-18 02:41:38
【问题描述】:
(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 和 waddle(最后两个此处未定义)显然是对 协程 进行迭代的过程通过传递给waddle 的树,它只产生叶子。就在waddle 的倒数第二个重新进入的收益率之前,它将重新进入点设置为它只会返回纯值'() 即而不是收益率'(),waddle 的em>实际值 是 '() ,就好像它一直是一个纯函数一样。
考虑到这一点,我们可以看到get-first 设置了什么...当waddle 返回“真实”时,它将在get-first 中的call/cc 内,然后(leave (quote ())) 是值的get-first(反过来,这个leave 打算在最后一次迭代中返回到get-next,因此是get-next 执行'() 的“实际”返回)。
那么为什么第二个版本不等效,waddle 的值 '() 将是 leave 的参数?
【问题讨论】:
-
没关系...混淆是因为“离开”不是我想要的函数,而是它在评估时评估的函数,这似乎是从左到右,因此在“蹒跚”之前。这意味着它评估为之前在语句中设置的值。道德:在使用函数时要小心在对函数的调用中重新定义!如果这是在从右到左的解释器上,则会在符号 leave 被查找为离开到任何地方的函数之前评估 waddle,在此期间它将被设置为 DIFFERENT 函数。真是一团糟……
-
很高兴听到它已解决,但请将解决方案作为答案发布(而不是在此处发表评论)并接受它。这样人们就可以看到问题已经解决,而无需来到这里。
-
@user1457584 两个版本都无法编译:
set!: unbound identifier in module in: leave
标签: scheme continuations callcc seasoned-schemer