packages feed

atomo-0.3: prelude/exception.atomo

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] }