shift/reset
code:ocaml
$ ochacaml
# reset (fun () -> 3 * shift (fun k -> 1 + k (k 5)));;
- : int = 46
code:racket
$ racket
(require racket/control)
(reset (* 3 (shift k (+ 1 (k (k 5))))))
46
reset は shift で capture される継続の delimiter
継続 k には fun x -> 3 * x が bind される。
k 5 は 15
k 15 は 45
1 + 45 は 46
hr.icon
code:ocaml
(define k (reset (let ((f (shift k k))) (* 3 (f)))))
(k (lambda () 7))
21
キャプチャーした継続をresetの外で呼び出し
shift によって capture される continuation は (lambda (x) (let ((f x)) (* 3 (f))))
shiftはその continuation を handler k に与える
つまり f はその continuation そのものが束縛
うーん意味分からん