[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