<div class="gmail_quote">On Tue, Jul 20, 2010 at 00:36, Dmitry Olshansky <span dir="ltr">&lt;<a href="mailto:dmitry.olsh@gmail.com">dmitry.olsh@gmail.com</a>&gt;</span> wrote:<br><div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Ah yes, but I regularly use algorithms structs as return values, like this:<br><div class="im">

<br>
auto nTimes(E, R)(E multiplier, R range)<br>
{<br>
    return map!((ElementType!R e) { return e*multiplier;})(range);<br>
}<br>
</div></blockquote></blockquote><div> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Try this workaround, replacing delegate with nested function, works for me:<div class="im">
<br>
auto nTimes(E, R)(E multiplier, R range){<br></div>
    ElementType!R fun(ElementType!R e) { return e*multiplier; }<br>
    return map!(fun)(range);<br>
}<br>
For some reason, compiler never plays nice with map, and I believe there are some issues with current implementation (2.047 release ) that Andrei (hopefully) fixed in recent commit.<br><br></blockquote><div><br>Hmm, using a nested function was the first thing I tried, and it didn&#39;t work at the time. Good to know it&#39;s a bug. right now, it does not work, though:<br>
<br><br>void main()<br>{<br>    auto arr = [0,1,2,3,4];<br>    writeln(array(nTimes(3, arr))); // prints 0, then four big numbers: it&#39;s stomping on another part of memory?<br>} <br><br>Strangely, even using 0 as a multiplier does not work. Using .save() in nTimes neither.<br>
<br>You see, these kinds of issues all have solutions (in that particular case, the workaround is a bit complicated but works in practice), but they are cumbersome and limit my usage of std.algorithms.<br><br>FWIW, the workaround I used there is to take the multiplier, call repeat on it to make it a range (3,3,3,3 ...), zip the two ranges together and call map with a function like this:  times(A,B)(Tuple!(A,B) t) { return t._0*t._1;}<br>
so, you get:  (0,3), (1,3), (2,3), ... and then 0,3,6, etc.<br>Extension of this idea saved me many times.<br><br><br>Philippe<br><br></div></div>