[svn] r6038: nemerle/trunk: boot/Nemerle.Compiler.dll boot/Nemerle.Macros.dll boot/Nemerle.dll boot/ncc.ex...

malekith svnadmin at nemerle.org
Fri Dec 23 15:57:47 CET 2005


Log:
Support [1,3...7] kind of ranges in list comprehensions.

Author: malekith
Date: Fri Dec 23 15:57:42 2005
New Revision: 6038

Modified:
   nemerle/trunk/boot/Nemerle.Compiler.dll
   nemerle/trunk/boot/Nemerle.Macros.dll
   nemerle/trunk/boot/Nemerle.dll
   nemerle/trunk/boot/ncc.exe
   nemerle/trunk/macros/Util.n
   nemerle/trunk/macros/core.n
   nemerle/trunk/ncc/parsing/MainParser.n
   nemerle/trunk/ncc/testsuite/positive/list-compr.n

Modified: nemerle/trunk/boot/Nemerle.Compiler.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/Nemerle.Macros.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/Nemerle.dll
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/boot/ncc.exe
==============================================================================
Binary files. No diff available.

Modified: nemerle/trunk/macros/Util.n
==============================================================================
--- nemerle/trunk/macros/Util.n	(original)
+++ nemerle/trunk/macros/Util.n	Fri Dec 23 15:57:42 2005
@@ -284,8 +284,32 @@
       exprs.Tail.Rev ().FoldLeft (<[ res ::= $(exprs.Head) ]>, 
         fun (e, acc) {
           match (e) {
-            | <[ @in ($e1, $e2) ]> =>
+            | <[ $e1 in [$first, $second ... $last] ]> =>
+              <[
+                 mutable i = $first;
+                 def delta = $second - i;
+                 def last = $last;
+                 while (if (delta < 0) i >= last else i <= last) {
+                   def $e1 = i;
+                   $acc;
+                   i += delta;
+                 }
+              ]>
+               
+            | <[ $e1 in [$first ... $last] ]> =>
+              <[
+                 mutable i = $first;
+                 def last = $last;
+                 while (i <= last) {
+                   def $e1 = i;
+                   $acc;
+                   i++;
+                 }
+              ]>
+               
+            | <[ $e1 in $e2 ]> =>
               <[ foreach ($e1 in $e2) $acc ]>
+              
             | cond =>
               <[ when ($cond) $acc ]>
           }

Modified: nemerle/trunk/macros/core.n
==============================================================================
--- nemerle/trunk/macros/core.n	(original)
+++ nemerle/trunk/macros/core.n	Fri Dec 23 15:57:42 2005
@@ -51,6 +51,7 @@
 [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, 120, 121)]
+[assembly: Nemerle.Internal.OperatorAttribute ("Nemerle.Core", "...", false, 230, 231)]
 [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	Fri Dec 23 15:57:42 2005
@@ -1610,6 +1610,13 @@
               | Token.Operator ("*") =>
                 NaryOperatorInfo (OperatorInfo.ProductInfo);
 
+              | Token.Operator (".") as op when
+                  op.Next is Token.Operator (".") &&
+                  op.Next.Next is Token.Operator (".") =>
+                shift ();
+                shift ();
+                env.FetchOperator ("...")
+
               | Token.Operator (str) =>
                 if (should_stop (stop))
                   null

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 15:57:42 2005
@@ -1,11 +1,34 @@
-System.Console.WriteLine ($[ (x,y) | x in [1,2,3], y in [1,2,3], x > y ]);
+#pragma indent
+using System.Console
+
+WriteLine ($[ (x,y) | x in [1,2,3], y in [1,2,3], x > y ])
 
 def _allMembers =
   $[m | a in System.AppDomain.CurrentDomain.GetAssemblies (),
-        t in a.GetTypes (), m in t.GetMembers ()].ToArray ();
+        t in a.GetTypes (), m in t.GetMembers ()].ToArray ()
+
+WriteLine ($[ x | x in [1 ... 12] ])
+WriteLine ($[ x | x in [1, 3 ... 12] ])
+WriteLine ($[ x | x in [10, 9 ... 1] ])
+
+
+def foo(k)
+  WriteLine ($"foo($k)")
+  k
+  
+// test side effects ordering
+WriteLine ($[ x | x in [foo (1), foo(3) ... foo (5)] ])
+
 
 /*
 BEGIN-OUTPUT
 [(2, 1), (3, 1), (3, 2)]
+[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+[1, 3, 5, 7, 9, 11]
+[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
+foo(1)
+foo(3)
+foo(5)
+[1, 3, 5]
 END-OUTPUT
 */



More information about the svn mailing list