1

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

举些例子,

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

应该给

hello, world
Exiting...

尽管

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

应该给

Not done yet...
bye, world

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

4

1 回答 1

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)))并且不保证是#tor #f

于 2018-10-12T22:28:33.373 回答