-- Assume double is a language construct that doubles a number State { Tc = ? Ctx = nil C = double (call/cc k . suc k) E = [] K = halt } State { Tc = ? Ctx = nil C = E = [x = call/cc k . suc k] K = halt } State { Tc = ? Ctx = } --- k : String -> N left part : (String -> N) -> Bool entire thing : (kont String -> N) -> Bool call/cc : ((String -> N) -> Bool) len (call/cc k . if k "hello" is even then true else false) (k . if k "hello" is even then true else false) (\x . len x) ((\x . 3 + x) 2 + (\x . 3 + x) 4) --- (call/cc \k . k 3) done 3 --- 3 + (call/cc \k . abort (k 2)) abort : _|_ -> A k : Nat -> _|_ k n = (yield 3 + n); exit k 2 : _|_ abort (k 2) : A \k . abort (k 2) : (Nat -> _|_) -> A (call/cc \k . abort (k 2)) : Nat --- cont (\n . 3 + n) -- apply-kont (Kont String Nat) Nat --