packages feed

ruler-core-1.0: examples/Alias.rul

{
{-# LANGUAGE BangPatterns #-}
module Alias where

import Control.Monad.Error
}

type ListX : [X]

data X
  con C

itf X
  visit v
    inh ast :: X
    syn x :: Int

datasem X
  clause C
    lhs.x = 1

itf ListX
  visit v
    inh ast :: ListX
    syn x :: Int

datasem ListX
  clause Cons
    invoke v of hd
    invoke v of tl
    lhs.x = hd.x + tl.x
  clause Nil
    lhs.x = 0

{
test :: ListX -> IO Int
test xs = do
  let inh = Inh_ListX_v { ast_Inh_ListX = xs }
  syn <- invoke_ListX_v dnt_ListX inh
  let x = x_Syn_ListX syn
  return x

main :: IO ()
main = do let list = [X_C,X_C,X_C]
          x <- test list
          putStrLn $ show x
}