strictness, ci
[minfp.git] / gen.icl
1 implementation module gen
2
3 import StdEnv
4
5 import Data.Either
6 import Data.Func
7 import Text
8
9 import ast
10
11 gen :: Expression -> Either [String] [String]
12 gen _ = Left ["genbork"]
13 /*
14 gen (AST fs) = Right
15 ["#include \"rts.h\"\n"
16 :genCode fs []
17 ]
18
19 class genCode a :: a [String] -> [String]
20 instance genCode String where genCode s c = [s:c]
21 instance genCode Char where genCode s c = genCode (toString s) c
22 instance genCode [a] | genCode a where
23 genCode [] c = c
24 genCode [a:as] c = genCode a (genCode as c)
25 instance genCode Function where
26 genCode (Function name args body) c
27 = ["struct stackval_t *", toString name, "(":genCode (join ", " ["struct stackval_t *" +++ toString a\\a<-args]) [") { return ":genCode body ["; }\n":c]]]
28 instance genCode Value where
29 genCode (Int i) c = ["lit(",toString i,")":c]
30 genCode (Bool i) c = ["lit(",if i "true" "false",")":c]
31 genCode (Func _ _ _) c = abort "help"
32 instance genCode Expression where
33 genCode (Lit l) c = genCode l c
34 genCode (Var ['if']) c = genCode (Var ['_if']) c
35 genCode (Var v) c = ["var(",toString v,")":c]
36 genCode (App a b) c = ["ap(":genCode a [", ":genCode b [")":c]]]
37 genCode (Lambda a b) c = abort "help"
38 genCode (Builtin b args) c = genCode b ["(":genCode args [")":c]]
39 */