是否可以定义一个过程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
之类的控制运算符,但没有成功。关键的困难似乎是无法确定当前的延续是否正在终止。有想法吗?
答案 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)))
现在,即使连续c
和end
具有相同的连续性,也不能保证可以将它们进行比较。这与以下语言细节有关:直到R6RS
都无法比较两个过程,并且我们没有真正比较过程,因此该实现可能已对halt
的延续进行了开放编码,以便包裹在一个lambda中,因此您实际上是在比较(eq? (lambda (v) (halt)) (lambda (v) (halt)))
,但不能保证它是#t
或#f
。