[svn] r6040: nemerle/trunk: boot/Nemerle.Compiler.dll
boot/Nemerle.Macros.dll boot/Nemerle.dll boot/ncc.ex...
malekith
svnadmin at nemerle.org
Sat Dec 24 12:20:13 CET 2005
Log:
Make the list comprehension macro more efficient. Use it in List.Map function (seem to give some marginal speedup to the compiler). Add list comprehension benchmark.
Author: malekith
Date: Sat Dec 24 12:20:11 2005
New Revision: 6040
Added:
nemerle/trunk/ncc/testsuite/benchmarks/list-compr.n
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/lib/list.n
nemerle/trunk/macros/Util.n
nemerle/trunk/ncc/typing/TypedTree.n
nemerle/trunk/ncc/typing/Typer.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/lib/list.n
==============================================================================
--- nemerle/trunk/lib/list.n (original)
+++ nemerle/trunk/lib/list.n Sat Dec 24 12:20:11 2005
@@ -761,7 +761,7 @@
}
public Map['a, 'b] (l : list ['a], f : 'a -> 'b) : list ['b] {
- List.Rev (List.RevMap (l, f))
+ $[ f(x) | x in l ]
}
public RevMap['a, 'b] (l : list ['a], f : 'a -> 'b) : list ['b] {
Modified: nemerle/trunk/macros/Util.n
==============================================================================
--- nemerle/trunk/macros/Util.n (original)
+++ nemerle/trunk/macros/Util.n Sat Dec 24 12:20:11 2005
@@ -312,8 +312,20 @@
macro ExpandListComprehension (params exprs : list [PExpr])
{
+ def adder =
+ <[
+ def cell = $(exprs.Head) :: [];
+ if (head == null) {
+ head = cell;
+ tail = cell;
+ } else {
+ _N_skip_write_check (tail.tl) = cell;
+ tail = cell;
+ }
+ ]>;
+
def loops =
- exprs.Tail.Rev ().FoldLeft (<[ res ::= $(exprs.Head) ]>,
+ exprs.Tail.Rev ().FoldLeft (adder,
fun (e, acc) {
match (e) {
| <[ $e1 in [$first, $second ... $last] ]> =>
@@ -331,9 +343,13 @@
});
<[
- mutable res = [];
+ mutable head = null;
+ mutable tail = null;
$loops;
- res.Rev ()
+ if (head == null)
+ []
+ else
+ head
]>
}
}
Added: nemerle/trunk/ncc/testsuite/benchmarks/list-compr.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/ncc/testsuite/benchmarks/list-compr.n Sat Dec 24 12:20:11 2005
@@ -0,0 +1,2 @@
+repeat (500000)
+ _ = $[x | x in [1 ... 100]];
Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n (original)
+++ nemerle/trunk/ncc/typing/TypedTree.n Sat Dec 24 12:20:11 2005
@@ -417,6 +417,8 @@
| Constrained = 0x0100
| GenerateTail = 0x0200
+
+ | SkipWriteCheck = 0x0400
}
public variant TExpr : Located
@@ -488,6 +490,7 @@
[FlagAccessor (JumpTarget, flags = WantSetter | Internal)]
[FlagAccessor (Visited, flags = WantSetter | Internal)]
[FlagAccessor (GenerateTail, flags = WantSetter | Internal)]
+ [FlagAccessor (SkipWriteCheck, flags = WantSetter | Internal)]
mutable flags : TExprFlags;
#region Typer4 and ILGenerator stuff
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Sat Dec 24 12:20:11 2005
@@ -549,7 +549,7 @@
}
| TExpr.StaticPropertyRef (_, p) when !need_ref => p.IsMutable
| TExpr.FieldMember (TExpr.This, _) when is_instance_ctor => true
- | TExpr.FieldMember (_, mem) => mem.IsMutable
+ | TExpr.FieldMember (_, mem) => mem.IsMutable || e.SkipWriteCheck
| TExpr.PropertyMember (_, p) when !need_ref => p.IsMutable
| TExpr.Call (TExpr.PropertyMember (_, p), _, _) when !need_ref => p.IsMutable
| TExpr.Call (TExpr.Delayed (dt), _, _) when !need_ref => dt.IsMutableIndexer
@@ -1329,6 +1329,10 @@
}
TypeExpr (loop (List.Rev (parms)), expected)
+ | PT.PExpr.Call (Ref (name = (idl = "_N_skip_write_check")), [parm]) =>
+ def e = TypeExpr (parm, expected);
+ e.SkipWriteCheck = true;
+ e
| PT.PExpr.Call (fnc, parms) =>
if (parms.Exists (fun (_) {
More information about the svn
mailing list