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