strictness, ci
[minfp.git] / gen.icl
diff --git a/gen.icl b/gen.icl
index 12877b9..6c7b5ee 100644 (file)
--- a/gen.icl
+++ b/gen.icl
@@ -2,12 +2,38 @@ implementation module gen
 
 import StdEnv
 
-import Control.Applicative
-import Control.Monad
-import Data.Functor
 import Data.Either
+import Data.Func
+import Text
 
 import ast
 
-gen :: AST -> Either [String] [String]
-gen _ = pure []
+gen :: Expression -> Either [String] [String]
+gen _ = Left ["genbork"]
+/*
+gen (AST fs) = Right
+       ["#include \"rts.h\"\n"
+       :genCode fs []
+       ]
+
+class genCode a :: a [String] -> [String]
+instance genCode String where genCode s c = [s:c]
+instance genCode Char where genCode s c = genCode (toString s) c
+instance genCode [a] | genCode a where
+       genCode [] c = c
+       genCode [a:as] c = genCode a (genCode as c)
+instance genCode Function where
+       genCode (Function name args body) c
+               = ["struct stackval_t *", toString name, "(":genCode (join ", " ["struct stackval_t *" +++ toString a\\a<-args]) [") { return ":genCode body ["; }\n":c]]]
+instance genCode Value where
+       genCode (Int i) c = ["lit(",toString i,")":c]
+       genCode (Bool i) c = ["lit(",if i "true" "false",")":c]
+       genCode (Func _ _ _) c = abort "help"
+instance genCode Expression where
+       genCode (Lit l) c = genCode l c
+       genCode (Var ['if']) c = genCode (Var ['_if']) c
+       genCode (Var v) c = ["var(",toString v,")":c]
+       genCode (App a b) c = ["ap(":genCode a [", ":genCode b [")":c]]]
+       genCode (Lambda a b) c = abort "help"
+       genCode (Builtin b args) c = genCode b ["(":genCode args [")":c]]
+*/