g e >>| getAdressbook >>= \ab->case 'Map'.get k ab of
Nothing = liftT (Left $ Error $ concat ["PANIC: ", k, " not found as var"])
Just (LAB t _ _) = liftT (Left $ Error $ "PANIC: cannot assign to function")
- Just (ADDR t ar) = tell [Instr "stl" [Lit t] ""]
+ Just (ADDR t ar) = case fs of
+ [] = tell [Instr "stl" [Lit t] ""]
+ _ = tell [Instr "ldl" [Lit t] ""]
+ >>| mapM_ followFs fs
+ >>| tell [Instr "sta" [Lit 0] ""]
g (FunStmt k es fs) = funnyStuff k es fs
g (ReturnStmt Nothing) = tell [Instr "unlink" [] ""]
>>| tell [Instr "ret" [] ""]
>>| tell [Instr "str" [Raw "RR"] ""]
>>| g (ReturnStmt Nothing)
+//expects the heap address to the var to slect on to be on the stack
+//and leaves the heap adress to write to on the stack
+followFs :: FieldSelector -> Gen()
+followFs FieldHd = tell [Instr "ldc" [Lit 1] "select hd"
+ ,Instr "sub" [] "select hd"]
+followFs FieldTl = tell []
+followFs FieldFst = tell [Instr "ldc" [Lit 1] "select fst"
+ ,Instr "sub" [] "select fst"]
+followFs FieldSnd = tell []
+
foldVarDecl :: Int VarDecl -> Gen Int
foldVarDecl x (VarDecl _ mt k e) = g e
>>| annote x k
reverseFs :: Type FieldSelector -> Typing Type
reverseFs t FieldHd = pure $ ListType t
-reverseFs t FieldTl = pure $ ListType t
+reverseFs t FieldTl = pure t
reverseFs t FieldFst = fresh >>= \tv -> pure $ TupleType (t, tv)
reverseFs t FieldSnd = fresh >>= \tv -> pure $ TupleType (tv, t)