On Tuesday, 16 October 2012 at 19:31:18 UTC, H. S. Teoh wrote:
On Tue, Oct 16, 2012 at 08:44:56PM +0200, monarch_dodra wrote:
[...]
No idea either, but I'll volunteer to investigate ;)

I agree with Jonathan though, sounds like a bug somewhere. There
is no reason for your code to fail.

I'll post back if I find anything.

Another data point: if I move the .joiner call out of cprod() into main(), then there is no problem. Could it be that something in joiner
is breaking somehow, when returned from a function?


T

I don't know, but if I change the code to this:

auto cprod(R1,R2)(R1 A, R2 B) {
    // This part is exactly the same as in main(), below. So
    // in theory, it should work exactly the same way.
auto mapper = (typeof(tuple(cast(size_t) 0, A.front, B.front)) a) => chain(
                    zip(repeat(a[1]), B.save.take(a[0])),
                    zip(A.save.take(a[0]+1), repeat(a[2])));

    auto r = zip(sequence!"n"(cast(size_t)0), A.save, B.save)
        .map!mapper()
        .joiner;

    // But something goes wrong here: is it because the
    // above composed ranges are stack-allocated temporaries
    // that go out of scope upon return?
    return r;
}

It works too.

Reply via email to