packages feed

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
}