+{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE QuasiQuotes #-}
module Main where
import Language
import Compiler
import Printer
+import Interpreter
+import Language.Quote
import Tuple
main :: IO ()
main
--- = putStrLn (runPrint e0)
--- >> putStrLn (runPrint e1)
--- >> putStrLn (runPrint e2)
--- >> putStrLn (runPrint e3)
--- >> putStrLn (show $ runCompiler e0)
--- = putStrLn (show $ interpret 10 <$> runCompiler e0)
--- = putStrLn (show $ interpret 10 <$> runCompiler e1'')
- = putStrLn (show $ interpret 10 <$> runCompiler (e1))
- >> putStrLn (show $ interpret 10 <$> runCompiler (tuplef0' e1))
- >> putStrLn (show $ interpret 10 <$> runCompiler (tuplef1' e1))
- >> putStrLn (show $ interpret 10 <$> runCompiler (tuplef1' $ second' e3))
- >> putStrLn (runPrint $ lit (42 :: Int) `cons` (lit (10 :: Int) `cons` nil))
- >> putStrLn (show $ interpret 20 <$> runCompiler (lit (42 :: Int) `cons` (lit (10 :: Int) `cons` nil)))
- >> putStrLn (runPrint $ unmain $ f0)
- >> putStrLn (show $ runCompiler (unmain f0))
- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f0))
- >> putStrLn (show $ runCompiler (unmain f1))
- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f1))
- >> putStrLn (show $ runCompiler (unmain f2))
- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f2))
- >> putStrLn (show $ runCompiler (unmain f3))
- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f3))
--- >> putStrLn (show $ interpret <$> runCompiler e1)
--- >> putStrLn (show $ interpret <$> runCompiler e1')
--- >> putStrLn (show $ interpret <$> runCompiler e1'')
+ = putStrLn (show $ interpret 10 <$> runCompiler (e1))
+-- >> putStrLn (show $ interpret 10 <$> runCompiler (tuplef0' e1))
+-- >> putStrLn (show $ interpret 10 <$> runCompiler (tuplef1' e1))
+-- >> putStrLn (show $ interpret 10 <$> runCompiler (tuplef1' $ second' e3))
+-- >> putStrLn (runPrint $ lit (42 :: Int) `cons` (lit (10 :: Int) `cons` nil))
+-- >> putStrLn (show $ interpret 20 <$> runCompiler (isNil $ lit (38 :: Int) `cons` nil))
+-- >> putStrLn (runPrint $ unmain $ f0)
+-- >> putStrLn (show $ runCompiler (unmain f0))
+-- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f0))
+-- >> putStrLn (show $ runCompiler (unmain f1))
+-- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f1))
+-- >> putStrLn (show $ runCompiler (unmain f2))
+-- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f2))
+-- >> putStrLn (show $ runCompiler (unmain f3))
+-- >> putStrLn (show $ interpret 20 <$> runCompiler (unmain f3))
+-- >> putStrLn (show $ runCompiler (unmain f4))
+-- >> putStrLn (show $ interpret 100 <$> runCompiler (unmain f4))
+-- >> putStrLn (show $ runInterpreter (unmain f2))
+-- >> putStrLn (show $ runInterpreter (unmain f4))
+ >> putStrLn (runPrint $ unmain f5)
+ >> putStrLn (show $ interpret 50 <$> runCompiler (unmain f5))
e0 :: Expression v => v Int
e0 = lit 2 ^. lit 8
f4 :: (Expression v, Function (v Int) v) => Main (v Int)
f4
- = fun ( \fac->(\x->x)
- :- Main {unmain=tuple (idfun (lit 42)) (idfun (lit 4)) }
+ = fun ( \fac->(\i->if' (i ==. lit 0) (lit 1) (i *. fac (i -. lit 1)))
+ :- Main {unmain=fac (lit 10)}
+ )
+
+f5 :: (List' v, Expression v, Function (v (List Int)) v) => Main (v Int)
+f5
+ = fun ( \sum->(\l->[cp|case l of
+ Cons e rest -> e +. sum rest
+ _ -> 0
+ |])
+ :- Main {unmain=sum $ lit (1 :: Int) `cons` (lit 2 `cons` (lit 3 `cons` nil))}
)