[svn] r6029: nemerle/trunk/ncc: generation/Typer3.n testsuite/positive/yield.n

malekith svnadmin at nemerle.org
Wed Dec 21 12:28:13 CET 2005


Log:
Use the 'this' type in enumerator generation, fixing polymorphic enumerator methods (resolves #587).

Author: malekith
Date: Wed Dec 21 12:28:13 2005
New Revision: 6029

Modified:
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/testsuite/positive/yield.n

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Wed Dec 21 12:28:13 2005
@@ -737,14 +737,14 @@
           public GetEnumerator () : System.Collections.Generic.IEnumerator [$(yield_type : typed)]
           {
             if ($interlocked_stuff) {
-              def res = $(name : name) ();
+              def res = $(name : name) () : this;
               res.CopyFrom (this);
               res
             } else
               this
           }
 
-          CopyFrom (other : $(name : name)) : void
+          CopyFrom (other : this) : void
           {
             _N_this_used = 1;
           }

Modified: nemerle/trunk/ncc/testsuite/positive/yield.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/yield.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/yield.n	Wed Dec 21 12:28:13 2005
@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using System;
 
 class C : IEnumerable [int] 
 {
@@ -58,6 +59,23 @@
   }
 }
 
+// #587
+public class Sequence
+{
+        public static Concat['a] (
+                 first : IEnumerable ['a],
+                 second : IEnumerable ['a]) : IEnumerable ['a]
+        {
+                when (first == null || second == null)
+                        throw ArgumentNullException ();
+
+                foreach (element in first)
+                        yield element;
+                foreach (element in second)
+                        yield element;
+        }
+}
+
 foreach (e in C ())
   System.Console.WriteLine (e);
 
@@ -92,6 +110,11 @@
   System.Console.WriteLine (e);
 System.Console.WriteLine ("------------");
 
+def fst = [1,2,3];
+def snd = [4,5,6];
+foreach (x in Sequence.Concat (fst, snd))
+   Nemerle.IO.printf ("%d\n", x);
+
 /*
 BEGIN-OUTPUT
 42
@@ -141,5 +164,11 @@
 46
 47
 ------------
+1
+2
+3
+4
+5
+6
 END-OUTPUT
 */



More information about the svn mailing list