【问题标题】:Seasoned Schemer's get-first, get-next, and waddle functions经验丰富的 Schemer 的 get-first、get-next 和 waddle 函数
【发布时间】: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-firstget-nextwaddle(最后两个此处未定义)显然是对 协程 进行迭代的过程通过传递给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


【解决方案1】:

混淆是因为“leave”不是我想要的函数,而是它评估为 when 评估的函数,它似乎是从左到右的,因此在“waddle”之前。这意味着它在之前的语句中评估它刚刚设置的值。

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

【讨论】:

  • 您应该将您的问题标记为已回答,即使您已经写下了答案。否则,它会显示在未答复列表中。
猜你喜欢
  • 2012-06-21
  • 2010-11-15
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多