是否可以检查当前延续是否终止?

时间:2018-10-10 19:53:00

标签: functional-programming scheme continuations delimited-continuations

是否可以定义一个过程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之类的控制运算符,但没有成功。关键的困难似乎是无法确定当前的延续是否正在终止。有想法吗?

1 个答案:

答案 0 :(得分: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