on master help sign in
Devise scheme for deterministic operator names
5758751Evan Czaplicki
src/AST/Helpers.hs+14−4
@@ -6,11 +6,13 @@ module AST.Helpers
6 , isTuple
6 , isTuple
7 , isOp
7 , isOp
8 , isSymbol
8 , isSymbol
9+ , desymbol
9 )
10 )
10 where
11 where
11
12
12import qualified Data.Char as Char
13import qualified Data.Char as Char
13−import qualified Data.Set as Set
14+import qualified Data.Map as Map
15+import Data.Map ((!))
14import qualified Data.Text as Text
16import qualified Data.Text as Text
15import Data.Text (Text)
17import Data.Text (Text)
16
18
@@ -47,9 +49,17 @@ isOp name =
47
49
48isSymbol :: Char -> Bool
50isSymbol :: Char -> Bool
49isSymbol c =
51isSymbol c =
50− Set.member c validSymbols
52+ Map.member c validSymbols
51
53
52
54
53−validSymbols :: Set.Set Char
55+validSymbols :: Map.Map Char Char
54validSymbols =
56validSymbols =
57+ Map.fromList $
58+ zip
55− Set.fromList "+-/*=.<>:&|^?%~!"
59+ "+-/*=.<>:&|^?%~!"
60+ "abcdefghijklmnop"
61+
62+
63+desymbol :: Text -> Text
64+desymbol name =
65+ Text.map (\c -> validSymbols ! c) name
src/Generate/JavaScript/Variable.hs+21−51
@@ -3,8 +3,6 @@
3module Generate.JavaScript.Variable
3module Generate.JavaScript.Variable
4 ( Generator
4 ( Generator
5 , run
5 , run
6− , Table
7− , emptyTable
8 , fresh
6 , fresh
9 , local
7 , local
10 , safe
8 , safe
@@ -15,9 +13,8 @@ module Generate.JavaScript.Variable
15 where
13 where
16
14
17
15
18−import qualified Control.Monad.State as State
16+import qualified Control.Monad.State.Strict as State
19import Data.Monoid ((<>))
17import Data.Monoid ((<>))
20−import qualified Data.Map as Map
21import qualified Data.Set as Set
18import qualified Data.Set as Set
22import qualified Data.Text as Text
19import qualified Data.Text as Text
23import Data.Text (Text)
20import Data.Text (Text)
@@ -34,28 +31,12 @@ import qualified Generate.JavaScript.Helpers as JS
34-- GENERATOR
31-- GENERATOR
35
32
36
33
37−type Generator = State.State Table
34+type Generator = State.State Int
38
35
39
36
40−run :: Table -> Generator a -> ( a, Table )
37+run :: Generator a -> a
41−run table generator =
38+run generator =
42− State.runState generator table
39+ State.evalState generator 0
43−
44−
45−
46−-- STATE
47−
48−
49−data Table =
50− Table
51− { _uid :: !Int
52− , _names :: Map.Map Var.Global Text
53− }
54−
55−
56−emptyTable :: Table
57−emptyTable =
58− Table 0 Map.empty
59
40
60
41
61
42
@@ -64,9 +45,9 @@ emptyTable =
64
45
65fresh :: Generator Text
46fresh :: Generator Text
66fresh =
47fresh =
67− do (Table uid names) <- State.get
48+ do uid <- State.get
68− State.put (Table (uid + 1) names)
49+ State.put (uid + 1)
69− return (Text.pack ("_v" ++ show uid))
50+ return ("_v" <> Text.pack (show uid))
70
51
71
52
72
53
@@ -117,26 +98,8 @@ global var =
117
98
118
99
119globalName :: Var.Global -> Generator Text
100globalName :: Var.Global -> Generator Text
120−globalName var =
101+globalName (Var.Global home name) =
121− do table <- State.get
122− globalNameHelp var table
123−
124−
125−globalNameHelp :: Var.Global -> Table -> Generator Text
126−globalNameHelp var@(Var.Global home name) (Table uid names) =
127− case Help.isOp name of
128− False ->
129− return $ globalToName home name
102+ return (globalToName home name)
130−
131− True ->
132− case Map.lookup var names of
133− Just jsName ->
134− return jsName
135−
136− Nothing ->
137− do let jsName = globalToName home ("_op" <> Text.pack (show uid))
138− State.put (Table (uid + 1) (Map.insert var jsName names))
139− return jsName
140
103
141
104
142globalToName :: ModuleName.Canonical -> Text -> Text
105globalToName :: ModuleName.Canonical -> Text -> Text
@@ -145,8 +108,15 @@ globalToName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
145 "_" <> ModuleName.getKernel moduleName <> "_" <> name
108 "_" <> ModuleName.getKernel moduleName <> "_" <> name
146
109
147 else
110 else
111+ let
112+ revisedName =
113+ if Help.isOp name then
114+ "_op_" <> Help.desymbol name
115+ else
116+ name
117+ in
148− Text.replace "-" "_" user
118+ Text.replace "-" "_" user
149− <> "$" <> Text.replace "-" "_" project
119+ <> "$" <> Text.replace "-" "_" project
150− <> "$" <> Text.replace "." "_" moduleName
120+ <> "$" <> Text.replace "." "_" moduleName
151− <> "$" <> name
121+ <> "$" <> revisedName
152
122