【问题标题】:I can't seem to wrap my mind around call/cc in Scheme我似乎无法在 Scheme 中全神贯注于 call/cc
【发布时间】:2011-07-15 05:05:37
【问题描述】:

有人对它的工作原理有很好的指导吗?带有视觉辅助的东西会很好,我遇到的每个指南似乎都在说同样的话,我需要重新理解它。

【问题讨论】:

  • 请把问题说清楚一点
  • 你指的是“连续传递风格”吗?
  • 调用当前继续
  • @Afnan:这个问题应该很清楚。 “什么是call/cc?” - 他还能补充什么?

标签: scheme call continuations callcc


【解决方案1】:

从不喜欢 call/cc 的可视化表示,因为我无法将其反映到代码中(是的,想象力很差);)

无论如何,如果您已经熟悉其他语言的异常,我认为不从 call/cc 而是从 call/ec(转义继续)开始会更容易。

这是一些应该评估为值的代码:

(lambda (x) (/ 1 x))

如果 x 等于“0”怎么办?在其他语言中我们可以抛出异常,那么方案呢? 我们也可以扔!

(lambda (x) (call/ec (cont) 
 (if (= x 0) (cont "Oh noes!") (/ 1 x))))

call/ec(以及 call/cc)在这里的工作方式类似于“try”。在命令式语言中,您可以轻松地跳出函数,只需返回值或抛出异常。 在功能上你不能跳出来,你应该评估一些东西。并且 call/* 来救援。 它的作用是将“call/ec”下的表达式表示为带有一个参数的函数(在我的情况下称为“cont”)。当调用此函数时,它会将整个调用/* 替换为其参数。

所以,当(cont "Oh noes!")(call/ec (cont) (if (= x 0) (cont "Oh noes!") (/ 1 x))) 替换为"Oh noes!" 字符串时。

call/cc 和 call/ec 几乎相等,除了 ec 更易于实现。它只允许跳上去,而cc可以从外面跳下来。

【讨论】:

    【解决方案2】:

    我发现它有助于可视化调用堆栈。在评估表达式时,请跟踪每一步的调用堆栈。 (参见例如http://4.flowsnake.org/archives/602)这可能是不直观的,因为在大多数语言中调用堆栈是隐式的;你不能直接操纵它。

    现在将延续视为保存调用堆栈的函数。当调用该函数时(使用值 X),它会恢复保存的调用堆栈,然后将 X 传递给它。

    【讨论】:

      【解决方案3】:

      学习call/cc没有捷径。阅读The Scheme Programming LanguageTeach Yourself Scheme in Fixnum Days中的章节。

      【讨论】:

      • 你可能想修复你的链接,因为要么参考相同的来源。
      【解决方案4】:

      这是我们 CS 实验室白板上留下的图表。所以你要取一些苹果,然后在开始之前抓住一个延续。你在森林中漫步,收集苹果,最后你将你的延续应用到你的苹果上。突然,你发现自己在进入森林之前所处的位置,除了你所有的苹果

      (display
        (call/cc (lambda (k)
                   (begin
                     (call-with-forest
                       (lambda (f)
                         (k (collect-apples f))))
                     (get-eaten-by-a-bear)))))
      
      => some apples (and you're not eaten by a bear)
      

      我认为可能涉及成年礼和埋藏的黄金。

      【讨论】:

      • 真的,你能得到比地下虫洞更好的视觉辅助工具吗??
      • 问题:看不懂续行就看不懂图片。另一方面,它是一个很好的可视化... +1
      • knivil:我从来没有说过这是一个很好的解释,但我觉得它应该保留在这里以供后代使用。
      • 弗里德曼式时光隧道!不过,我从未见过熊的变化。
      • 我很确定这是达斯汀的画。
      【解决方案5】:

      看看PLAI的续篇——非常“实用” 导向”,并且它使用“黑洞”可视化来进行延续,可以帮助您 明白了。

      【讨论】:

      • 新版本出来了。在作者最近的 Brown-plus-online 课程中使用。
      猜你喜欢
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2017-11-14
      • 2018-09-05
      • 1970-01-01
      • 2015-03-27
      相关资源
      最近更新 更多