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