[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