macro (action handle: (branches: Block)) { handlers = branches contents map: { `(~c -> ~e) | `(~c -> !escape-handle yield: ~e) } `({ !escape-handle | ~action bind: ~(`Block new: handlers) } call/cc) } call macro (a handle: (b: Block) ensuring: (c: Block)) `({ ~a handle: ~b } ensuring: ~c) (action: Block) catch: recover := { cc | action bind: { Error -> { e | cc yield: (recover call: e) } } } call/cc macro (a catch: (b: Block) ensuring: (c: Block)) `({ ~a catch: ~b } ensuring: ~c) (action: Block) ensuring: (cleanup: Block) := action after: cleanup v ensuring: p do: b := { b call: v } ensuring: { p call: v }