ruler-core-1.0: examples/Eval.rul
{
{-# LANGUAGE BangPatterns #-}
module Eval where
import Control.Monad.Error
}
data Expr
con Int
x :: Int
con Plus
l :: Expr
r :: Expr
itf Eval
visit eval
inh e :: Expr
syn val :: Int
{
eval = sem eval : Eval monad IO
visit eval
clause int
match Expr.Int@loc = lhs.e
lhs.val = loc.x
clause plus
attach m : Decon_Expr_Plus = mkDecon_Expr_Plus
m.data = lhs.e
invoke deconstruct of m
child l : Eval = eval
child r : Eval = eval
l.e = m.l
r.e = m.r
invoke eval of l
invoke eval of r
lhs.val = l.val + r.val
}
{
test :: Expr -> IO Int
test exp = do
let inh = Inh_Eval_eval { e_Inh_Eval = exp }
syn <- invoke_Eval_eval eval inh
let x = val_Syn_Eval syn
return x
main :: IO ()
main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))
x <- test exp
putStrLn $ show x
}