Продолжение никогда не бывает пустым.То, что происходит после завершения, зависит от реализации, но всегда есть какое-то освобождение и отключение ресурсов.
Итак, представьте, что у вас есть следующий код, на который я очень надеялся:
(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
.