on master help sign in
Devise scheme for deterministic operator names

All symbols are replaced by ASCII letters in a predictable way.

commit5758751eb4835dd0514669519103cda444206198 authorEvan Czaplicki <evancz@users.noreply.github.com> dateTue 16 May 2017, 22:26 (9 years ago) parent101709f
2 files changed+35−55
src/AST/Helpers.hs+14−4 src/Generate/JavaScript/Variable.hs+21−51
src/AST/Helpers.hs+14−4
@@ -6,11 +6,13 @@ module AST.Helpers
66 , isTuple
77 , isOp
88 , isSymbol
9+ , desymbol
910 )
1011 where
1112
1213import qualified Data.Char as Char
13−import qualified Data.Set as Set
14+import qualified Data.Map as Map
15+import Data.Map ((!))
1416import qualified Data.Text as Text
1517import Data.Text (Text)
1618
@@ -47,9 +49,17 @@ isOp name =
4749
4850isSymbol :: Char -> Bool
4951isSymbol c =
50− Set.member c validSymbols
52+ Map.member c validSymbols
5153
5254
53−validSymbols :: Set.Set Char
55+validSymbols :: Map.Map Char Char
5456validSymbols =
55− Set.fromList "+-/*=.<>:&|^?%~!"
57+ Map.fromList $
58+ zip
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 @@
33module Generate.JavaScript.Variable
44 ( Generator
55 , run
6− , Table
7− , emptyTable
86 , fresh
97 , local
108 , safe
@@ -15,9 +13,8 @@ module Generate.JavaScript.Variable
1513 where
1614
1715
18−import qualified Control.Monad.State as State
16+import qualified Control.Monad.State.Strict as State
1917import Data.Monoid ((<>))
20−import qualified Data.Map as Map
2118import qualified Data.Set as Set
2219import qualified Data.Text as Text
2320import Data.Text (Text)
@@ -34,28 +31,12 @@ import qualified Generate.JavaScript.Helpers as JS
3431-- GENERATOR
3532
3633
37−type Generator = State.State Table
34+type Generator = State.State Int
3835
3936
40−run :: Table -> Generator a -> ( a, Table )
41−run table generator =
42− State.runState generator table
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
37+run :: Generator a -> a
38+run generator =
39+ State.evalState generator 0
5940
6041
6142
@@ -64,9 +45,9 @@ emptyTable =
6445
6546fresh :: Generator Text
6647fresh =
67− do (Table uid names) <- State.get
68− State.put (Table (uid + 1) names)
69− return (Text.pack ("_v" ++ show uid))
48+ do uid <- State.get
49+ State.put (uid + 1)
50+ return ("_v" <> Text.pack (show uid))
7051
7152
7253
@@ -117,26 +98,8 @@ global var =
11798
11899
119100globalName :: Var.Global -> Generator Text
120−globalName var =
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
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
101+globalName (Var.Global home name) =
102+ return (globalToName home name)
140103
141104
142105globalToName :: ModuleName.Canonical -> Text -> Text
@@ -145,8 +108,15 @@ globalToName (ModuleName.Canonical (Pkg.Name user project) moduleName) name =
145108 "_" <> ModuleName.getKernel moduleName <> "_" <> name
146109
147110 else
148− Text.replace "-" "_" user
149− <> "$" <> Text.replace "-" "_" project
150− <> "$" <> Text.replace "." "_" moduleName
151− <> "$" <> name
111+ let
112+ revisedName =
113+ if Help.isOp name then
114+ "_op_" <> Help.desymbol name
115+ else
116+ name
117+ in
118+ Text.replace "-" "_" user
119+ <> "$" <> Text.replace "-" "_" project
120+ <> "$" <> Text.replace "." "_" moduleName
121+ <> "$" <> revisedName
152122