[svn] r6030: nemerle/trunk: macros/Util.n macros/core.n
ncc/parsing/MainParser.n ncc/testsuite/positive/li...
malekith
svnadmin at nemerle.org
Wed Dec 21 14:00:09 CET 2005
Log:
Make 'in' an infix operator. Add some basic support for list comprehension. No ranges yet.
Author: malekith
Date: Wed Dec 21 14:00:08 2005
New Revision: 6030
Added:
nemerle/trunk/ncc/testsuite/positive/list-compr.n
Modified:
nemerle/trunk/macros/Util.n
nemerle/trunk/macros/core.n
nemerle/trunk/ncc/parsing/MainParser.n
Modified: nemerle/trunk/macros/Util.n
==============================================================================
--- nemerle/trunk/macros/Util.n (original)
+++ nemerle/trunk/macros/Util.n Wed Dec 21 14:00:08 2005
@@ -277,4 +277,24 @@
"..., id_n) = pattern''")
}
}
+
+ macro ExpandListComprehension (params exprs : list [PExpr])
+ {
+ def loops =
+ exprs.Tail.Rev ().FoldLeft (<[ res ::= $(exprs.Head) ]>,
+ fun (e, acc) {
+ match (e) {
+ | <[ @in ($e1, $e2) ]> =>
+ <[ foreach ($e1 in $e2) $acc ]>
+ | cond =>
+ <[ when ($cond) $acc ]>
+ }
+ });
+
+ <[
+ mutable res = [];
+ $loops;
+ res.Rev ()
+ ]>
+ }
}
Modified: nemerle/trunk/macros/core.n
==============================================================================
--- nemerle/trunk/macros/core.n (original)
+++ nemerle/trunk/macros/core.n Wed Dec 21 14:00:08 2005
@@ -50,6 +50,7 @@
[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", "<<", false, 230, 231)]
[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", ">>", false, 230, 231)]
[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", "::", false, 221, 220)]
+[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", "in", false, 215, 301)]
[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", "as", false, 215, 301)]
[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", "<", false, 210, 211)]
[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", ">", false, 210, 211)]
Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n (original)
+++ nemerle/trunk/ncc/parsing/MainParser.n Wed Dec 21 14:00:08 2005
@@ -1899,6 +1899,23 @@
shift ();
// the sprint macro must get current location and global context...
Util.locate (stok.Location, <[ $(mkname ("Nemerle") : name).IO.sprint ($(str : string)) ]>)
+
+ | Token.SquareGroup (group) as grp =>
+ shift ();
+ push_stream (group);
+ def expr = parse_expr_sequence (TokenStoppers.Pipe);
+ match (stream) {
+ | Token.LooseGroup (Child = Token.Operator ("|")) as t =>
+ t.Child = t.Child.Next;
+ | _ => {}
+ }
+ def conds = parse_expr_sequence (TokenStoppers.None);
+ def all = expr + conds;
+ pop_stream ("list comprehension");
+ Util.locate (grp.Location,
+ <[ $(mkname ("Nemerle") : name).Utility.
+ ExpandListComprehension (..$all) ]>)
+
| _ =>
push_back ();
parse_spliced_expr ();
Added: nemerle/trunk/ncc/testsuite/positive/list-compr.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/positive/list-compr.n Wed Dec 21 14:00:08 2005
@@ -0,0 +1,7 @@
+System.Console.WriteLine ($[ (x,y) | x in [1,2,3], y in [1,2,3], x > y ]);
+
+/*
+BEGIN-OUTPUT
+[(2, 1), (3, 1), (3, 2)]
+END-OUTPUT
+*/
More information about the svn
mailing list