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



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

例如,

(display "hello, worldn")
(f)

应该给

hello, world
Exiting...

(f)
(display "bye, worldn")

应该给

Not done yet...
bye, world

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

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

所以想象一下你有以下代码,我寄予厚望:

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

现在,不能保证可以比较延续cend,即使它们具有相同的延续。这与语言细节有关,到目前为止R6RS没有办法比较两个过程,而且我们并没有真正比较过程,因此实现可能已经开放编码了它们的halt延续,以便它被包装在 lambda 中,因此您实际上是在比较(eq? (lambda (v) (halt)) (lambda (v) (halt)))并且不能保证#t#f

最新更新