【问题标题】:Is it possible to check if the current continuation is terminating?是否可以检查当前的延续是否正在终止?
【发布时间】:2019-03-15 19:29:22
【问题描述】:

是否可以定义一个过程f,如果它是退出前的最后一件事,则打印Exiting...,否则打印Not done yet...

例如,

(display "hello, world\n")
(f)

应该给

hello, world
Exiting...

虽然

(f)
(display "bye, world\n")

应该给

Not done yet...
bye, world

我曾想过使用shift/reset等控制运算符,但没有成功。关键的困难似乎是没有办法判断当前的延续是否正在终止。有什么想法吗?

【问题讨论】:

    标签: functional-programming scheme continuations delimited-continuations


    【解决方案1】:

    延续永远不会是空的。结束后发生的事情是特定于实现的,但总会有某种资源释放和关闭。

    假设您有以下我寄予厚望的代码:

    (call/cc (lambda (end)
      (define (f)
        (call/cc (lambda (c)
          (if (eq? c end)
              (display "bye, world\n") 
              (display "Not done yet...")))))
      (f)
      (display "hello, world\n")
      (f)))
    

    现在你不能保证cend 的延续可以被比较,即使它们是相同的延续。这与语言细节有关,直到R6RS 没有办法比较两个过程,而且我们并没有真正比较过程,所以实现可能已经打开了它们的halt 延续代码,这样它就被包裹在一个 lambda 中因此,您实际上是在比较 (eq? (lambda (v) (halt)) (lambda (v) (halt))),但不能保证是 #t#f

    【讨论】:

    • 感谢调查!我已编辑问题以将术语更改为“终止延续”。此外,我在不同的方案(mit、racket、guile、bigloo、chibi、chicken)上尝试了代码,但它们都打印出类似Not done yet... hello, world Not done yet... 的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多