atomo-0.1: src/Atomo/Kernel/Exception.hs
{-# LANGUAGE QuasiQuotes #-}
module Atomo.Kernel.Exception (load) where
import Atomo.Environment
import Atomo.Haskell
load :: VM ()
load = do
[$p|raise: v|] =: do
v <- here "v"
throwError (Error v)
[$p|(action: Block) catch: (recover: Block)|] =:
catchError (eval [$e|action call|]) $ \err -> do
recover <- here "recover"
args <- list [asValue err]
dispatch (keyword ["call"] [recover, args])
[$p|(action: Block) catch: (recover: Block) ensuring: (cleanup: Block)|] =:
catchError (eval [$e|action call|]) $ \err -> do
recover <- here "recover"
args <- list [asValue err]
res <- dispatch (keyword ["call"] [recover, args])
eval [$e|cleanup call|]
return res
[$p|(action: Block) ensuring: (cleanup: Block)|] =:
catchError
(do r <- eval [$e|action call|]
eval [$e|cleanup call|]
return r)
(\err -> eval [$e|cleanup call|] >> throwError err)
[$p|v ensuring: p do: b|] =:::
[$e|{ b call: [v] } ensuring: { p call: [v] }|]
asValue :: AtomoError -> Value
asValue (Error v) = v
asValue (ParseError pe) =
keyParticleN ["parse-error"] [string (show pe)]
asValue (DidNotUnderstand m) =
keyParticleN ["did-not-understand"] [Message m]
asValue (Mismatch pat v) =
keyParticleN
["pattern", "did-not-match"]
[Pattern pat, v]
asValue (ImportError ie) =
keyParticleN ["import-error"] [string (show ie)]
asValue (FileNotFound fn) =
keyParticleN ["file-not-found"] [string fn]
asValue (ParticleArity e' g) =
keyParticleN
["particle-needed", "given"]
[Integer (fromIntegral e'), Integer (fromIntegral g)]
asValue (BlockArity e' g) =
keyParticleN
["block-expected", "given"]
[Integer (fromIntegral e'), Integer (fromIntegral g)]
asValue NoExpressions = particle "no-expressions"
asValue (ValueNotFound d v) =
keyParticleN ["could-not-found", "in"] [string d, v]