import StdEnv
-import Control.Applicative
-import Control.Monad
-import Data.Functor
import Data.Either
+import Text
import ast
gen :: AST -> Either [String] [String]
-gen _ = pure []
+gen (AST fs) = Right (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
+ = ["stackval_t ", toString name, "(":genCode (join ", " (map toString args)) [") { return ":genCode body ["; }\n":c]]]
+instance genCode Value where
+ genCode (Int i) c = genCode (toString i) c
+ genCode (Char i) c = genCode ['\'',i,'\''] c
+ genCode (Bool i) c = genCode (if i "true" "false") c
+ genCode (Func _ _ _) c = abort "help"
+instance genCode Expression where
+ genCode (Lit l) c = genCode l c
+ genCode (Var v) c = genCode 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]]