[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