[svn] r6039: nemerle/trunk: macros/Util.n ncc/testsuite/positive/list-compr.n

malekith svnadmin at nemerle.org
Fri Dec 23 16:17:21 CET 2005


Log:
Fix nested ranges.

Author: malekith
Date: Fri Dec 23 16:17:20 2005
New Revision: 6039

Modified:
   nemerle/trunk/macros/Util.n
   nemerle/trunk/ncc/testsuite/positive/list-compr.n

Modified: nemerle/trunk/macros/Util.n
==============================================================================
--- nemerle/trunk/macros/Util.n	(original)
+++ nemerle/trunk/macros/Util.n	Fri Dec 23 16:17:20 2005
@@ -278,34 +278,49 @@
     }
   }
   
-  macro ExpandListComprehension (params exprs : list [PExpr])
+  public module ListComprehensionHelper
   {
-    def loops =
-      exprs.Tail.Rev ().FoldLeft (<[ res ::= $(exprs.Head) ]>, 
-        fun (e, acc) {
-          match (e) {
-            | <[ $e1 in [$first, $second ... $last] ]> =>
+    [Nemerle.Macros.Hygienic]
+    public ExpandRange (first : PExpr, second : option [PExpr], last : PExpr, pat : PExpr, acc : PExpr) : PExpr
+    {
+      match (second) {
+        | Some (second) =>
               <[
                  mutable i = $first;
                  def delta = $second - i;
                  def last = $last;
                  while (if (delta < 0) i >= last else i <= last) {
-                   def $e1 = i;
+               def $pat = i;
                    $acc;
                    i += delta;
                  }
               ]>
                
-            | <[ $e1 in [$first ... $last] ]> =>
+        | None =>
               <[
                  mutable i = $first;
                  def last = $last;
                  while (i <= last) {
-                   def $e1 = i;
+               def $pat = i;
                    $acc;
                    i++;
                  }
               ]>
+      }
+    }
+  }
+  
+  macro ExpandListComprehension (params exprs : list [PExpr])
+  {
+    def loops =
+      exprs.Tail.Rev ().FoldLeft (<[ res ::= $(exprs.Head) ]>, 
+        fun (e, acc) {
+          match (e) {
+            | <[ $e1 in [$first, $second ... $last] ]> =>
+              ListComprehensionHelper.ExpandRange (first, Some (second), last, e1, acc)
+               
+            | <[ $e1 in [$first ... $last] ]> =>
+              ListComprehensionHelper.ExpandRange (first, None (), last, e1, acc)
                
             | <[ $e1 in $e2 ]> =>
               <[ foreach ($e1 in $e2) $acc ]>

Modified: nemerle/trunk/ncc/testsuite/positive/list-compr.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/list-compr.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/list-compr.n	Fri Dec 23 16:17:20 2005
@@ -16,9 +16,16 @@
   WriteLine ($"foo($k)")
   k
   
+def bar(k)
+  WriteLine ($"bar($k)")
+  k
+  
 // test side effects ordering
 WriteLine ($[ x | x in [foo (1), foo(3) ... foo (5)] ])
 
+WriteLine ($[ (x,y) | x in [foo (1), foo (3) ... foo (7)],
+                      y in [bar (2), bar (4) ... bar (8)] ])
+
 
 /*
 BEGIN-OUTPUT
@@ -30,5 +37,21 @@
 foo(3)
 foo(5)
 [1, 3, 5]
+foo(1)
+foo(3)
+foo(7)
+bar(2)
+bar(4)
+bar(8)
+bar(2)
+bar(4)
+bar(8)
+bar(2)
+bar(4)
+bar(8)
+bar(2)
+bar(4)
+bar(8)
+[(1, 2), (1, 4), (1, 6), (1, 8), (3, 2), (3, 4), (3, 6), (3, 8), (5, 2), (5, 4), (5, 6), (5, 8), (7, 2), (7, 4), (7, 6), (7, 8)]
 END-OUTPUT
 */



More information about the svn mailing list