Deleted bad sample programs, added polymorphic call in polymorphic function test
This commit is contained in:
parent
63f9689f38
commit
d377ded7e1
10 changed files with 50 additions and 41 deletions
|
|
@ -9,40 +9,41 @@ import Monomorpher.Monomorpher (monomorphize)
|
|||
import Grammar.Print (printTree)
|
||||
import System.IO (stderr)
|
||||
import GHC.IO.Handle.Text (hPutStrLn)
|
||||
import Test.Hspec
|
||||
|
||||
printToErr :: String -> IO ()
|
||||
printToErr = hPutStrLn stderr
|
||||
|
||||
-- A simple demo
|
||||
simpleDemo = do
|
||||
printToErr "# Monomorphic function f"
|
||||
printToErr "#### f"
|
||||
printToErr "-- Lifted Tree --"
|
||||
printToErr $ printTree example1
|
||||
printToErr "-- Monomorphized Tree --"
|
||||
printToErr $ printTree (monomorphize example1)
|
||||
|
||||
printToErr "# Polymorphic function p"
|
||||
printToErr "#### p"
|
||||
printToErr "-- Lifted Tree --"
|
||||
printToErr $ printTree example2
|
||||
printToErr "-- Monomorphized Tree --"
|
||||
printToErr $ printTree (monomorphize example2)
|
||||
|
||||
printToErr "#### g"
|
||||
printToErr "-- Lifted Tree --"
|
||||
printToErr $ printTree example3
|
||||
printToErr "-- Monomorphized Tree --"
|
||||
printToErr $ printTree (monomorphize example3)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
return ()
|
||||
|
||||
-- | Reusable test constructs for Monomorpher.
|
||||
typeInt :: T.Type
|
||||
typeInt = T.TMono $ Ident "Int"
|
||||
|
||||
typeIntToInt :: T.Type
|
||||
typeIntToInt = T.TArr typeInt typeInt
|
||||
|
||||
typeA :: T.Type
|
||||
typeA = T.TPol $ Ident "a"
|
||||
|
||||
typeAToA :: T.Type
|
||||
typeAToA = T.TArr typeA typeA
|
||||
|
||||
-- f :: Int -> Int
|
||||
|
|
@ -50,35 +51,37 @@ typeAToA = T.TArr typeA typeA
|
|||
fName = (Ident "f", typeIntToInt)
|
||||
fArg1 = (Ident "x", typeInt)
|
||||
fArgs = [fArg1]
|
||||
fExp :: T.Exp
|
||||
fExp = T.EAdd typeInt (T.EId (Ident "x", typeInt)) (T.EId (Ident "x", typeInt))
|
||||
f :: T.Bind
|
||||
f = T.Bind fName fArgs fExp
|
||||
|
||||
-- f :: a -> a
|
||||
-- f x = x + x
|
||||
-- p :: a -> a
|
||||
-- p x = x + x
|
||||
pName = (Ident "p", typeAToA)
|
||||
pArg1 = (Ident "x", typeA)
|
||||
pArgs = [pArg1]
|
||||
pExp :: T.Exp
|
||||
pExp = T.EAdd typeA (T.EId (Ident "x", typeA)) (T.EId (Ident "x", typeA))
|
||||
p :: T.Bind
|
||||
p = T.Bind pName pArgs pExp
|
||||
|
||||
-- g :: a -> a
|
||||
-- g x = x + (p x)
|
||||
gName = (Ident "g", typeAToA)
|
||||
gArg1 = (Ident "x", typeA)
|
||||
gArgs = [gArg1]
|
||||
gExp = T.EAdd typeA (T.EId (Ident "x", typeA)) (T.EApp typeA (T.EId (Ident "p", typeAToA)) (T.EId (Ident "x", typeA)))
|
||||
g = T.Bind gName gArgs gExp
|
||||
|
||||
-- | Examples
|
||||
mainName = (Ident "main", typeInt)
|
||||
-- func 5
|
||||
mainBoilerProg func binds = T.Program (T.Bind mainName [] (mainBoilerExp func) : binds)
|
||||
mainBoilerExp func = T.EApp typeInt (T.EId (Ident func, typeIntToInt)) (T.ELit typeInt $ LInt 5)
|
||||
|
||||
-- main = f 5
|
||||
example1Name = (Ident "main", typeInt)
|
||||
example1Exp :: T.Exp
|
||||
example1Exp = T.EApp typeInt (T.EId (Ident "f", typeIntToInt)) (T.ELit typeInt $ LInt 5)
|
||||
example1 :: T.Program
|
||||
example1 = T.Program [T.Bind example1Name [] example1Exp, f]
|
||||
example1 = mainBoilerProg "f" [f]
|
||||
|
||||
-- main = p 5
|
||||
example2Name = (Ident "main", typeInt)
|
||||
example2Exp :: T.Exp
|
||||
example2Exp = T.EApp typeInt (T.EId (Ident "p", typeIntToInt)) (T.ELit typeInt $ LInt 5)
|
||||
example2 :: T.Program
|
||||
example2 = T.Program [T.Bind example2Name [] example2Exp, p]
|
||||
example2 = mainBoilerProg "p" [p]
|
||||
|
||||
-- main = g 5
|
||||
example3 = mainBoilerProg "g" [g, p]
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue