@@ -144,17 +144,7 @@ generateCode expr =
144144 generateFunction args body
145145
146146 Call func args ->
147− let
148− arity = length args
149− aN = "A" ++ show arity
150− in
151− do jsFunc <- generateJsExpr func
152− jsArgs <- mapM generateJsExpr args
153− jsExpr $
154− if 2 <= arity && arity <= 9 then
155− ref aN `call` (jsFunc:jsArgs)
156− else
157− foldl1 (<|) (jsFunc:jsArgs)
147+ generateCall func args
158148
159149 TailCall name argNames args ->
160150 let
@@ -282,6 +272,94 @@ generateFunctionWithArity rawArgs code =
282272
283273
284274
275+-- GENERATE CALL
276+
277+
278+generateCall :: Opt.Expr -> [Opt.Expr] -> State Int Code
279+generateCall func args =
280+ case (func, args) of
281+ (Opt.Var var, [arg]) ->
282+ case getUnaryOp var of
283+ Just op ->
284+ do jsArg <- generateJsExpr arg
285+ jsExpr $ PrefixExpr () op jsArg
286+
287+ Nothing ->
288+ generateCallHelp func args
289+
290+ (Opt.Var var, [left, right]) ->
291+ case getBinaryOp var of
292+ Just op ->
293+ do jsLeft <- generateJsExpr left
294+ jsRight <- generateJsExpr right
295+ jsExpr $ InfixExpr () op jsLeft jsRight
296+
297+ Nothing ->
298+ generateCallHelp func args
299+
300+ _ ->
301+ generateCallHelp func args
302+
303+
304+generateCallHelp :: Opt.Expr -> [Opt.Expr] -> State Int Code
305+generateCallHelp func args =
306+ let
307+ arity = length args
308+ aN = "A" ++ show arity
309+ in
310+ do jsFunc <- generateJsExpr func
311+ jsArgs <- mapM generateJsExpr args
312+ jsExpr $
313+ if 2 <= arity && arity <= 9 then
314+ ref aN `call` (jsFunc:jsArgs)
315+ else
316+ foldl1 (<|) (jsFunc:jsArgs)
317+
318+
319+getUnaryOp :: Var.Canonical -> Maybe PrefixOp
320+getUnaryOp var =
321+ if var == bitwiseComplement then
322+ Just PrefixBNot
323+
324+ else if var == basicsNot then
325+ Just PrefixLNot
326+
327+ else
328+ Nothing
329+
330+
331+getBinaryOp :: Var.Canonical -> Maybe InfixOp
332+getBinaryOp (Var.Canonical home name) =
333+ if home /= bitwise then
334+ Nothing
335+
336+ else
337+ case name of
338+ "and" -> Just OpBAnd
339+ "or" -> Just OpBOr
340+ "xor" -> Just OpBXor
341+ "shiftLeft" -> Just OpLShift
342+ "shiftRight" -> Just OpSpRShift
343+ "shiftRightLogical" -> Just OpZfRShift
344+ _ -> Nothing
345+
346+
347+bitwiseComplement :: Var.Canonical
348+bitwiseComplement =
349+ Var.inCore ["Bitwise"] "complement"
350+
351+
352+basicsNot :: Var.Canonical
353+basicsNot =
354+ Var.inCore ["Basics"] "not"
355+
356+
357+bitwise :: Var.Home
358+bitwise =
359+ Var.Module (ModuleName.inCore ["Bitwise"])
360+
361+
362+
285363-- GENERATE IFS
286364
287365