on master help sign in
Update to newest head
commitab5baf6812f0035d5a1c5cf92d2b9e2572715e57 authorChristian Widera <xash@posteo.de> dateTue 1 Apr 2014, 00:48 (13 years ago) parentb146491a3d6dab
4 files changed+50−28
compiler/Generate/Cases.hs+14−11 compiler/Generate/JavaScript.hs+8−5 libraries/Array.elm+19−3 libraries/Native/Graphics/Input.js+9−9
compiler/Generate/Cases.hs+14−11
@@ -13,7 +13,6 @@ import qualified SourceSyntax.Pattern as P
1313import qualified SourceSyntax.Variable as V
1414import Transform.Substitute
1515
16−
1716toMatch :: [(P.Pattern, Expr)] -> State Int (String, Match)
1817toMatch patterns = do
1918 v <- newVar
@@ -37,16 +36,19 @@ data Clause =
3736 deriving Show
3837
3938matchSubst :: [(String,String)] -> Match -> Match
40−matchSubst _ Break = Break
41−matchSubst _ Fail = Fail
42−matchSubst pairs (Seq ms) = Seq (map (matchSubst pairs) ms)
43−matchSubst pairs (Other (A a e)) =
44− Other . A a $ foldr ($) e $ map (\(x,y) -> subst x (rawVar y)) pairs
45−matchSubst pairs (Match n cs m) =
46− Match (varSubst n) (map clauseSubst cs) (matchSubst pairs m)
47− where varSubst v = fromMaybe v (lookup v pairs)
48− clauseSubst (Clause c vs m) =
49− Clause c (map varSubst vs) (matchSubst pairs m)
39+matchSubst pairs match =
40+ case match of
41+ Break -> Break
42+ Fail -> Fail
43+ Seq ms -> Seq (map (matchSubst pairs) ms)
44+ Other (A a e) ->
45+ Other . A a $ foldr ($) e $ map (\(x,y) -> subst x (rawVar y)) pairs
46+ Match n cs m ->
47+ Match (varSubst n) (map clauseSubst cs) (matchSubst pairs m)
48+ where
49+ varSubst v = fromMaybe v (lookup v pairs)
50+ clauseSubst (Clause c vs m) =
51+ Clause c (map varSubst vs) (matchSubst pairs m)
5052
5153isCon (p:_, _) =
5254 case p of
@@ -68,6 +70,7 @@ match vs@(v:_) cs def
6870 where
6971 cs' = map (dealias v) cs
7072
73+dealias :: String -> ([P.Pattern],Expr) -> ([P.Pattern],Expr)
7174dealias v c@(p:ps, A a e) =
7275 case p of
7376 P.Alias x pattern -> (pattern:ps, A a $ subst x (rawVar v) e)
compiler/Generate/JavaScript.hs+8−5
@@ -55,6 +55,7 @@ expression :: Expr -> State Int (Expression ())
5555expression (A region expr) =
5656 case expr of
5757 Var (V.Raw x) -> return $ obj x
58+
5859 Literal lit -> return $ literal lit
5960
6061 Range lo hi ->
@@ -215,19 +216,19 @@ definition (Definition pattern expr@(A region _) _) = do
215216 decl x n = varDecl x (dotSep ["$","_" ++ show n])
216217 setup vars
217218 | Help.isTuple name = assign "$" : vars
218− | otherwise = assign "$raw" : safeAssign : vars
219+ | otherwise = assign "_raw" : safeAssign : vars
219220
220− safeAssign = varDecl "$" (CondExpr () if' (obj "$raw") exception)
221− if' = InfixExpr () OpStrictEq (obj "$raw.ctor") (string name)
221+ safeAssign = varDecl "$" (CondExpr () if' (obj "_raw") exception)
222+ if' = InfixExpr () OpStrictEq (obj "_raw.ctor") (string name)
222223 exception = obj "_E.Case" `call` [ref "$moduleName", string (renderPretty region)]
223224
224225 _ ->
225226 do defs' <- concat <$> mapM toDef vars
226− return (VarDeclStmt () [assign "$"] : defs')
227+ return (VarDeclStmt () [assign "_"] : defs')
227228 where
228229 vars = P.boundVarList pattern
229230 mkVar = A region . rawVar
230− toDef y = let expr = A region $ Case (mkVar "$") [(pattern, mkVar y)]
231+ toDef y = let expr = A region $ Case (mkVar "_") [(pattern, mkVar y)]
231232 in definition $ Definition (P.Var y) expr Nothing
232233
233234match :: Region -> Case.Match -> State Int [Statement ()]
@@ -254,9 +255,11 @@ match region mtch =
254255 return [ ExprStmt () (obj "_E.Case" `call` [ref "$moduleName", string (renderPretty region)]) ]
255256
256257 Case.Break -> return [BreakStmt () Nothing]
258+
257259 Case.Other e ->
258260 do e' <- expression e
259261 return [ ret e' ]
262+
260263 Case.Seq ms -> concat <$> mapM (match region) (dropEnd [] ms)
261264 where
262265 dropEnd acc [] = acc
libraries/Array.elm+19−3
@@ -1,8 +1,8 @@
11module Array where
22
3−{-| A library for manipulating arrays of elements. The elements in an
4−array must have the same type. The arrays are implemented in Relaxed
5−Radix Balanced-Trees for fast updating and concating.
3+{-| A library for immutable arrays. The elements in an array must have the same
4+type. The arrays are implemented in Relaxed Radix Balanced-Trees for fast
5+reads, updates, and concatenation.
66
77If you use more then one map or zip function on an array, consider turning it
88into a list before operating on it, and then turning it back into an array.
@@ -133,10 +133,18 @@ get = Native.Array.get
133133 getMaybe 2 (A.fromList [3,2,1]) == Just 2
134134 getMaybe 5 (A.fromList [3,2,1]) == Nothing
135135-}
136+<<<<<<< HEAD
136137getMaybe : Int -> Array a -> Maybe a
137138getMaybe i array = if Native.Array.length array > i
138139 then Just (Native.Array.get i array)
139140 else Nothing
141+=======
142+safeGet : Int -> Array a -> Maybe a
143+safeGet i array =
144+ if i < Native.Array.length array
145+ then Just (Native.Array.get i array)
146+ else Nothing
147+>>>>>>> dev
140148
141149{-| Get the element at the index. If the index is out of range, the given default
142150element is returned.
@@ -144,9 +152,17 @@ element is returned.
144152 getSafe 0 2 (A.fromList [3,2,1]) == 1
145153 getSafe 0 5 (A.fromList [3,2,1]) == 0
146154-}
155+<<<<<<< HEAD
147156getSafe : a -> Int -> Array a -> a
148157getSafe default i array = if Native.Array.length array > i
149158 then Native.Array.get i array else default
159+=======
160+getWithDefault : a -> Int -> Array a -> a
161+getWithDefault default i array =
162+ if i < Native.Array.length array
163+ then Native.Array.get i array
164+ else default
165+>>>>>>> dev
150166
151167{-| Set the element at the index. Returns the updated array, or if the index is
152168out of range, the unaltered array.
libraries/Native/Graphics/Input.js+9−9
@@ -12,7 +12,7 @@ Elm.Native.Graphics.Input.make = function(elm) {
1212 var Text = Elm.Native.Text.make(elm);
1313 var Signal = Elm.Signal.make(elm);
1414 var newElement = Elm.Graphics.Element.make(elm).newElement;
15− var JS = Elm.Native.JavaScript.make(elm);
15+ var List = Elm.Native.List.make(elm);
1616 var Utils = Elm.Native.Utils.make(elm);
1717 var Tuple2 = Utils.Tuple2;
1818
@@ -23,14 +23,14 @@ Elm.Native.Graphics.Input.make = function(elm) {
2323
2424 function renderDropDown(signal, values) {
2525 return function(_) {
26− var entries = JS.fromList(values);
26+ var entries = List.toArray(values);
2727
2828 var drop = newNode('select');
2929 drop.style.border = '0 solid';
3030 drop.style.pointerEvents = 'auto';
3131 for (var i = 0; i < entries.length; ++i) {
3232 var option = newNode('option');
33− var name = JS.fromString(entries[i]._0);
33+ var name = entries[i]._0;
3434 option.value = name;
3535 option.innerHTML = name;
3636 drop.appendChild(option);
@@ -91,7 +91,7 @@ Elm.Native.Graphics.Input.make = function(elm) {
9191 type: 'Button',
9292 render: renderButton,
9393 update: updateButton,
94− model: { signal:signal, value:value, text:JS.fromString(text) }
94+ model: { signal:signal, value:value, text:text }
9595 });
9696 }
9797
@@ -266,8 +266,8 @@ Elm.Native.Graphics.Input.make = function(elm) {
266266 field.style.pointerEvents = 'auto';
267267
268268 field.type = model.type;
269− field.placeholder = JS.fromString(model.placeHolder);
270− field.value = JS.fromString(model.content.string);
269+ field.placeholder = model.placeHolder;
270+ field.value = model.content.string;
271271
272272 field.elm_signal = model.signal;
273273 field.elm_handler = model.handler;
@@ -287,7 +287,7 @@ Elm.Native.Graphics.Input.make = function(elm) {
287287
288288 elm.notify(field.elm_signal.id, field.elm_handler({
289289 _:{},
290− string: JS.toString(next),
290+ string: next,
291291 selection: {
292292 _:{},
293293 start: start,
@@ -338,8 +338,8 @@ Elm.Native.Graphics.Input.make = function(elm) {
338338 field.elm_handler = newModel.handler;
339339
340340 field.type = newModel.type;
341− field.placeholder = JS.fromString(newModel.placeHolder);
342− var value = JS.fromString(newModel.content.string);
341+ field.placeholder = newModel.placeHolder;
342+ var value = newModel.content.string;
343343 field.value = value;
344344 field.elm_old_value = value;
345345 if (field.elm_hasFocus) {