Всем привет!
Продолжаю пилить свою r5rs, дошло дело до continuations.
Пишу на java, поэтому выбирать средства для манипуляций со стеком особо не приходится: есть только Exceptions.
Соответственно, делаю примерно так, как сделано в Kawa:
https://www.gnu.org/software/kawa/internals/complications.html
Кое-как оно работает, но далеко не всегда, и я уже мозг себе сломал пытаясь понять почему.
Например, этот кусок кода работает правильно (взят с Вики):
(define (f return)
(return 2)
3)
(display (f (lambda (x) x))) ; displays 3
(display (call-with-current-continuation f)) ; displays 2
Далее, это тоже работает:
(define (cc) (call-with-current-continuation (lambda (cc) (cc cc))))
(cc) ;; => #<continuation>
А вот это уже не работает:
(define (cc) (call-with-current-continuation (lambda (cc) (cc cc))))
((cc) display) ;; должно выводить #<procedure:display>
((cc) display) кидает CalledContinuation exception.
И вот тут я не понимаю, что я должен с этим делать.
Kawa пишет:
If it is “our” continuation, return the value passed to the continuation; otherwise re-throw it up the stack until we get a matching handler.
Что значит «our»?
Даже если я оберну ту строчку, в которой кидается CalledContinuation в try-catch и буду ловить CalledContinuation, то что мне потм с ним делать?
PS: ying-yang puzzle тоже не работает: выводит первые два символа, потом тоже кидает CalledContinuation, с которым тоже не знаю что делать.