@@ -16,11 +16,12 @@ import Data.Char
16import Data.List
16import Data.List
17import qualified Data.Map as Map
17import qualified Data.Map as Map
18import System.IO
18import System.IO
19+import System.Directory
20idrNamespace :: String
21idrNamespace :: String
21idrNamespace = "__IDR__"
22idrNamespace = "__IDR__"
23−data JSTarget = Node | JavaScript
24+data JSTarget = Node | JavaScript deriving Eq
25codegenJavaScript
26codegenJavaScript
26 :: JSTarget
27 :: JSTarget
@@ -29,17 +30,25 @@ codegenJavaScript
29 -> OutputType
30 -> OutputType
31codegenJavaScript target definitions filename outputType = do
32codegenJavaScript target definitions filename outputType = do
32− let runtime = case target of
33+ let (header, runtime) = case target of
33− Node -> "-node"
34+ Node ->
35+ ("#!/usr/bin/env node\n", "-node")
34− JavaScript -> "-browser"
36+ JavaScript ->
35 path <- getDataDir
38 path <- getDataDir
36 idrRuntime <- readFile $ path ++ "/js/Runtime-common.js"
39 idrRuntime <- readFile $ path ++ "/js/Runtime-common.js"
37 tgtRuntime <- readFile $ concat [path, "/js/Runtime", runtime, ".js"]
40 tgtRuntime <- readFile $ concat [path, "/js/Runtime", runtime, ".js"]
38− writeFile filename (idrRuntime
41+ writeFile filename ( header
39 ++ tgtRuntime
43 ++ tgtRuntime
40 ++ modules
44 ++ modules
41 ++ functions
45 ++ functions
42 ++ mainLoop)
46 ++ mainLoop)
48+ setPermissions filename (emptyPermissions { readable = True
49+ , executable = target == Node
44 def = map (first translateNamespace) definitions
53 def = map (first translateNamespace) definitions
@@ -340,7 +349,7 @@ translateExpression (SOp op vars)
340 , (arg:_) <- vars = translateVariableName arg ++ "[0]"
349 , (arg:_) <- vars = translateVariableName arg ++ "[0]"
341 | LStrRev <- op
350 | LStrRev <- op
342 , (arg:_) <- vars = let v = translateVariableName arg in
351 , (arg:_) <- vars = let v = translateVariableName arg in
343− v ++ "split('').reverse().join('')"
352+ v ++ ".split('').reverse().join('')"
344 | LStrIndex <- op
353 | LStrIndex <- op
345 , (lhs:rhs:_) <- vars = let l = translateVariableName lhs
354 , (lhs:rhs:_) <- vars = let l = translateVariableName lhs
346 r = translateVariableName rhs in
355 r = translateVariableName rhs in
@@ -472,7 +481,7 @@ translateCase var (SConstCase ty e)
472 matchHelper tyName = translateTypeMatch var tyName e
481 matchHelper tyName = translateTypeMatch var tyName e
474translateCase var (SConstCase cst@(BI _) e) =
483translateCase var (SConstCase cst@(BI _) e) =
475− let cond = var ++ ".equals(" ++ translateConstant cst ++ ")" in
484+ let cond = "__IDRRT__.bigInt(" ++ var ++ ").equals(" ++ translateConstant cst ++ ")" in
476 createIfBlock cond (translateExpression e)
485 createIfBlock cond (translateExpression e)
478translateCase var (SConstCase cst e) =
487translateCase var (SConstCase cst e) =