@@ -144,17 +144,7 @@ generateCode expr =
144 generateFunction args body
144 generateFunction args body
146 Call func args ->
146 Call func args ->
147− let
147+ generateCall func args
149− aN = "A" ++ show arity
151− do jsFunc <- generateJsExpr func
152− jsArgs <- mapM generateJsExpr args
154− if 2 <= arity && arity <= 9 then
155− ref aN `call` (jsFunc:jsArgs)
157− foldl1 (<|) (jsFunc:jsArgs)
159 TailCall name argNames args ->
149 TailCall name argNames args ->
@@ -282,6 +272,94 @@ generateFunctionWithArity rawArgs code =
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
284+ do jsArg <- generateJsExpr arg
285+ jsExpr $ PrefixExpr () op jsArg
288+ generateCallHelp func args
290+ (Opt.Var var, [left, right]) ->
291+ case getBinaryOp var of
293+ do jsLeft <- generateJsExpr left
294+ jsRight <- generateJsExpr right
295+ jsExpr $ InfixExpr () op jsLeft jsRight
298+ generateCallHelp func args
301+ generateCallHelp func args
304+generateCallHelp :: Opt.Expr -> [Opt.Expr] -> State Int Code
305+generateCallHelp func args =
308+ aN = "A" ++ show arity
310+ do jsFunc <- generateJsExpr func
311+ jsArgs <- mapM generateJsExpr args
313+ if 2 <= arity && arity <= 9 then
314+ ref aN `call` (jsFunc:jsArgs)
316+ foldl1 (<|) (jsFunc:jsArgs)
319+getUnaryOp :: Var.Canonical -> Maybe PrefixOp
321+ if var == bitwiseComplement then
324+ else if var == basicsNot then
331+getBinaryOp :: Var.Canonical -> Maybe InfixOp
332+getBinaryOp (Var.Canonical home name) =
333+ if home /= bitwise then
338+ "and" -> Just OpBAnd
340+ "xor" -> Just OpBXor
341+ "shiftLeft" -> Just OpLShift
342+ "shiftRight" -> Just OpSpRShift
343+ "shiftRightLogical" -> Just OpZfRShift
347+bitwiseComplement :: Var.Canonical
349+ Var.inCore ["Bitwise"] "complement"
352+basicsNot :: Var.Canonical
354+ Var.inCore ["Basics"] "not"
359+ Var.Module (ModuleName.inCore ["Bitwise"])
285-- GENERATE IFS
363-- GENERATE IFS