summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/urweb.grm20
-rw-r--r--tests/list.ur16
2 files changed, 28 insertions, 8 deletions
diff --git a/src/urweb.grm b/src/urweb.grm
index a74a48c8..1e1fe2ed 100644
--- a/src/urweb.grm
+++ b/src/urweb.grm
@@ -933,6 +933,16 @@ eexp : eapps (eapps)
| eexp CARET eexp (native_op ("strcat", eexp1, eexp2, s (eexp1left, eexp2right)))
+ | eterm DCOLON eexp (let
+ val loc = s (etermleft, eexpright)
+ in
+ (EApp ((EVar (["Basis"], "Cons", Infer), loc),
+ (ERecord [((CName "1", loc),
+ eterm),
+ ((CName "2", loc),
+ eexp)], loc)), loc)
+ end)
+
bind : SYMBOL LARROW eapps (SYMBOL, NONE, eapps)
| UNIT LARROW eapps (let
val loc = s (UNITleft, eappsright)
@@ -1161,6 +1171,8 @@ eterm : LPAREN eexp RPAREN (#1 eexp, s (LPARENleft, RPARENright))
| LET edecls IN eexp END (ELet (edecls, eexp), s (LETleft, ENDright))
+ | LBRACK RBRACK (EVar (["Basis"], "Nil", Infer), s (LBRACKleft, RBRACKright))
+
edecls : ([])
| edecl edecls (edecl :: edecls)
@@ -1196,6 +1208,13 @@ branchs: ([])
pat : pterm (pterm)
| cpath pterm (PCon (#1 cpath, #2 cpath, SOME pterm), s (cpathleft, ptermright))
+ | pterm DCOLON pat (let
+ val loc = s (ptermleft, patright)
+ in
+ (PCon (["Basis"], "Cons", SOME (PRecord ([("1", pterm),
+ ("2", pat)], false), loc)),
+ loc)
+ end)
pterm : SYMBOL (PVar SYMBOL, s (SYMBOLleft, SYMBOLright))
| cpath (PCon (#1 cpath, #2 cpath, NONE), s (cpathleft, cpathright))
@@ -1209,6 +1228,7 @@ pterm : SYMBOL (PVar SYMBOL, s (SYMBOLleft, SYMBOLright
| LPAREN ptuple RPAREN (PRecord (ListUtil.mapi (fn (i, p) => (Int.toString (i + 1), p)) ptuple,
false),
s (LPARENleft, RPARENright))
+ | LBRACK RBRACK (PCon (["Basis"], "Nil", NONE), s (LBRACKleft, RBRACKright))
rpat : CSYMBOL EQ pat ([(CSYMBOL, pat)], false)
| INT EQ pat ([(Int64.toString INT, pat)], false)
diff --git a/tests/list.ur b/tests/list.ur
index 480bdd3e..472b9ea1 100644
--- a/tests/list.ur
+++ b/tests/list.ur
@@ -1,22 +1,22 @@
fun isNil (t ::: Type) (ls : list t) =
case ls of
- Nil => True
+ [] => True
| _ => False
fun delist (ls : list string) : xbody =
case ls of
- Nil => <xml>Nil</xml>
- | Cons (h, t) => <xml>{[h]} :: {delist t}</xml>
+ [] => <xml>Nil</xml>
+ | h :: t => <xml>{[h]} :: {delist t}</xml>
fun callback ls = return <xml><body>
{delist ls}
</body></xml>
fun main () = return <xml><body>
- {[isNil (Nil : list bool)]},
- {[isNil (Cons (1, Nil))]},
- {[isNil (Cons ("A", Cons ("B", Nil)))]}
+ {[isNil ([] : list bool)]},
+ {[isNil (1 :: [])]},
+ {[isNil ("A" :: "B" :: [])]}
- <p>{delist (Cons ("X", Cons ("Y", Cons ("Z", Nil))))}</p>
- <a link={callback (Cons ("A", Cons ("B", Nil)))}>Go!</a>
+ <p>{delist ("X" :: "Y" :: "Z" :: [])}</p>
+ <a link={callback ("A" :: "B" :: [])}>Go!</a>
</body></xml>