digitalmars.D.learn - Compiler errors and recursive nested functions
- Dylan Knutson (22/22) Jun 12 2013 Hello! I'm trying to make a deepMap function which operates on
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (4/26) Jun 12 2013 Perhaps this limitation:
- Dylan Knutson (40/40) Jun 12 2013 DPaste has stopped responding to requests at the time of writing,
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (10/21) Jun 12 2013 As a workaround, make that lambda a free-standing function here:
Hello! I'm trying to make a deepMap function which operates on the deepest non-range element of an array. I think that this function should theoretically work, however there are some compiler errors that I can't quite understand. Here's the code: http://dpaste.dzfl.pl/97918311 And the compiler error because DPaste's compiler service seems to be offline: src\algorithm_util.d(26): Error: function algorithm_util.__unittestL34_5.deepMap!(__lambda4, int[]).deepMap is a nested function and cannot be accessed from algorithm_util.__unittestL34_5.deepMap!(__lambda4, int[][]).deepMap.__lambda2300!(int[]).__lambda2300DMD v2.064 DEBUG deepMap works just fine if I pass in an array that isn't nested, so this will work: auto a = [1, 2, 3]; auto b = a.deepMap!(a => a + 1)(); writeln(b); // "[2, 3, 4]" Can someone explain what is going on? Thank you, Dylan Knutson
Jun 12 2013
On 06/12/2013 03:45 PM, Dylan Knutson wrote:Hello! I'm trying to make a deepMap function which operates on the deepest non-range element of an array. I think that this function should theoretically work, however there are some compiler errors that I can't quite understand. Here's the code: http://dpaste.dzfl.pl/97918311 And the compiler error because DPaste's compiler service seems to be offline: src\algorithm_util.d(26): Error: function algorithm_util.__unittestL34_5.deepMap!(__lambda4, int[]).deepMap is a nested function and cannot be accessed from algorithm_util.__unittestL34_5.deepMap!(__lambda4, int[][]).deepMap.__lambda2300!(int[]).__lambda2300DMD v2.064 DEBUG deepMap works just fine if I pass in an array that isn't nested, so this will work: auto a = [1, 2, 3]; auto b = a.deepMap!(a => a + 1)(); writeln(b); // "[2, 3, 4]" Can someone explain what is going on? Thank you, Dylan KnutsonPerhaps this limitation: http://d.puremagic.com/issues/show_bug.cgi?id=5710 Ali
Jun 12 2013
DPaste has stopped responding to requests at the time of writing, so here's the code in case its still down by the time someone reads this: ---- import std.algorithm : map; import std.range : isInputRange, ElementType; // Doesn't work //template deepMap(alias pred, Range) //if(isInputRange!Range) //{ // static if(isInputRange!(ElementType!Range)) // { // alias deepMap = map!(a => deepMap!(pred, typeof(a))(a)); // } // else // { // alias deepMap = map!(pred); // } //} // Neither does this, for the same reason auto deepMap(alias pred, Range)(Range r) if(isInputRange!Range) { static if(isInputRange!(ElementType!Range)) { return r.map!( a => a.deepMap!(pred)() )(); } else { return r.map!(pred)(); } } unittest { import std.stdio; auto a = [[1, 1], [1, 1]]; auto b = a.deepMap!(a => a + 1)(); writeln(b); //assert(b == [[2, 2], [2, 2]]); } ----
Jun 12 2013
On 06/12/2013 03:49 PM, Dylan Knutson wrote:DPaste has stopped responding to requests at the time of writing,Being an old ;) old-timer I never understood the need for those sites.---- import std.algorithm : map; import std.range : isInputRange, ElementType;As a workaround, make that lambda a free-standing function here: auto intermediate(T, alias pred)(T a) { return a.deepMap!(pred)(); }// Neither does this, for the same reason auto deepMap(alias pred, Range)(Range r) if(isInputRange!Range) { static if(isInputRange!(ElementType!Range)) { return r.map!( a => a.deepMap!(pred)() )();And use that free-standing instead: return r.map!(intermediate!(ElementType!Range, pred))(); Ali
Jun 12 2013