【问题标题】:Code a continuation that does nothing编写一个什么都不做的延续
【发布时间】:2012-04-30 14:26:44
【问题描述】:

也许我的问题有一个非常简单的答案,但我找不到。

在 Scheme R6RS 中,我如何构建一个什么都不做且需要任何参数的延续?

我的目标是继续,让我们将其命名为QUIT,这样如果我有以下代码:

((lambda ()
  (display 1)
  (display 2)
  (QUIT)
  (displey "A")))

preints 1 和 2 但不是 "A".+

你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: scheme continuations r6rs


    【解决方案1】:

    最直接的方式是使用简单的“return”风格延续:

    (call/cc (lambda (return) 
        (display 1) 
        ...
        (return) 
        (display "A")))
    

    这有帮助吗?

    【讨论】:

    • 好的,谢谢。我对可以重用的返回函数的定义很感兴趣;所以,我从你的回答中汲取灵感:(define quit #f),然后是(call/cc (lambda (k) (set! quit k)))
    • @Justin 发生了什么是 call/cc 备份上下文,并且在 lambda 中调用(返回)使程序继续跳转到调用 call/cc 之后的指令,对吗? ?
    • @dader - 是的,这是延续的最简单和最直接的用法之一。事实上,它可以被称为“转义延续”,因为它将控制权恢复到封闭范围。
    • 我可以假设延续会更好地用于例如回溯递归下降解析器,而不是触发回溯的异常?
    • @dader - 延续是实现控制流的通用方式,很像 GOTO,因此在这两种情况下都有很好的用途。例如,考虑延续是在 Scheme 中实现 return 的唯一方法(或至少是最简单的方法)。
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2018-11-11
    • 2018-08-19
    相关资源
    最近更新 更多