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: Block) := { 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] }