@@ -319,31 +319,45 @@ translateConstant c =
319 JSError $ "Unimplemented Constant: " ++ show c
319 JSError $ "Unimplemented Constant: " ++ show c
321translateDeclaration :: (String, SDecl) -> JS
321translateDeclaration :: (String, SDecl) -> JS
322−translateDeclaration (path, SFun name params stackSize body) =
322+translateDeclaration (path, SFun name params stackSize body)
323+ | (MN _ "APPLY") <- name =
324+ JSSeq [ JSRaw $ "/* " ++ translateName name ++ " */"
323− JSAlloc (path ++ translateName name) $ Just $ JSFunction p (
325+ , translate (path ++ translateName name) params stackSize body
325− zipWith assignVar [0..] p ++
327+ | (MN _ "EVAL") <- name
326− map allocVar [numP .. (numP + stackSize - 1)] ++
328+ , (SChkCase var cases) <- body =
327− [JSReturn $ translateExpression body]
329+ JSSeq [ JSRaw $ "/* " ++ translateName name ++ " */"
328− )
330+ , translate (path ++ translateName name) params stackSize body
333+ translate (path ++ translateName name) params stackSize body
330− numP :: Int
335+ translate :: String -> [Name] -> Int -> SExp -> JS
331− numP = length params
336+ translate name params stackSize body =
332−
337+ JSAlloc name $ Just $ JSFunction p (
333− allocVar :: Int -> JS
338+ JSSeq $
334− allocVar n = JSAlloc (jsVar n) Nothing
339+ zipWith assignVar [0..] p ++
335−
340+ map allocVar [numP .. (numP + stackSize - 1)] ++
336− assignVar :: Int -> String -> JS
341+ [JSReturn $ translateExpression body]
337− assignVar n s = JSAlloc (jsVar n) (Just $ JSRaw s)
342+ )
340− p = map translateParameter params
345+ numP = length params
347+ allocVar :: Int -> JS
348+ allocVar n = JSAlloc (jsVar n) Nothing
350+ assignVar :: Int -> String -> JS
351+ assignVar n s = JSAlloc (jsVar n) (Just $ JSRaw s)
354+ p = map translateParameter params
342− translateParameter :: Name -> String
356+ translateParameter :: Name -> String
343− translateParameter (MN i name) =
357+ translateParameter (MN i name) =
344− translateIdentifier name ++ show i
358+ translateIdentifier name ++ show i
345− translateParameter (UN name) =
359+ translateParameter (UN name) =
346− translateIdentifier name
360+ translateIdentifier name
348translateVariableName :: LVar -> String
362translateVariableName :: LVar -> String
349translateVariableName (Loc i) =
363translateVariableName (Loc i) =