Можно ли проверить, заканчивается ли текущее продолжение? - PullRequest
0 голосов
/ 10 октября 2018

Можно ли определить процедуру 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 голосов
/ 13 октября 2018

Продолжение никогда не бывает пустым.То, что происходит после завершения, зависит от реализации, но всегда есть какое-то освобождение и отключение ресурсов.

Итак, представьте, что у вас есть следующий код, на который я очень надеялся:

(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 так, чтобы оно было заключено в лямбдуи, таким образом, вы действительно сравниваете (eq? (lambda (v) (halt)) (lambda (v) (halt))), и это не обязательно будет #t или #f.

...