www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5052] New: take!(Take!R) should return Take!R, not Take!(Take!R)

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5052

           Summary: take!(Take!R) should return Take!R, not Take!(Take!R)
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: ASSIGNED
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: bugzilla kyllingen.net
        ReportedBy: bugzilla kyllingen.net


--- Comment #0 from Lars T. Kyllingstad <bugzilla kyllingen.net> 2010-10-13
23:52:56 PDT ---
From D.learn:


On Wed, 13 Oct 2010 18:06:15 +0000, Lars T. Kyllingstad wrote:

 On Wed, 13 Oct 2010 16:46:09 +0000, Nick Treleaven wrote:
 
 Hi,
 I'm new to D2 ranges but have been following D for some time. I'm
 posting here because I want to check if I'm doing anything wrong before
 filing a bug.
 
 The code below is a test case I made after hitting the problem in real
 code. Basically the pyramid recursive function should print out: [1, 2,
 3]
 [1, 2]
 [1]
 
 This works fine when calling with an int[] range, but calling with
 SList!int seems to make the compiler hang, eating up memory.
 
 Should I file a bug?
 
 
 import std.stdio;
 import std.range;
 import std.container;
 
 void pyramid(Range)(Range items)
 {
 	if (items.empty)
 		return;
 	writeln(items);
 	auto len = walkLength(items);
 	auto r = take(items, len - 1);
 	pyramid(r);
 }
 
 void main()
 {
 	/* array version is fine */
 	int[] arr = [1, 2, 3];
 	pyramid(arr[]);
 	
 	SList!int list = [1, 2, 3];
 	pyramid(list[]);	/* infinite loop with dmd 2.049 */
 }
You are creating an infinite recursion of templates. For an array the return type of take() is the same array type. For other ranges, the return type of take() is Take!Range. So when you instantiate pyramid! Range, it instantiates pyramid!(Take!Range), and then pyramid!(Take!(Take! Range)), and so on ad infinitum. A solution could be to make take!(Take!Range)() just return another Take! Range. [...]
-- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 13 2010
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5052



--- Comment #1 from Lars T. Kyllingstad <bugzilla kyllingen.net> 2010-10-14
00:17:39 PDT ---
Fixed in SVN:
http://www.dsource.org/projects/phobos/changeset/2102

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 14 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5052


Lars T. Kyllingstad <bugzilla kyllingen.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 13 2010