[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