On Saturday, 8 March 2014 at 01:10:38 UTC, H. S. Teoh wrote:
Having a way to auto-generate input range boilerplate, though, would be really, *really* nice.

Eh, I don't think it is a big deal and would be fairly limited compared to the current setup. If you use a fiber or state variable or something for the yield this yield that trick, how do you go backward? Random access?

I think the best the yield stuff can do is maybe forward range and maybe infinite (probably with an annotation of some sort, since otherwise, the infiniteness wouldn't be obvious at compile time).


So the best we're looking to automate is input or perhaps forward ranges. And how hard are these really to write?

yield query(string q) {
   auto result = c_query(toStringz(q));
   while(!HasRow(result))
      yield GetNextRow(result);
}

OK, that is kinda nice, but, is the status quo so bad? (BTW the reason I went with some kind of C database api here is everything else I could think of are actually pretty short when using std.algorithm functions to help define them.)

struct query {
    private Result result;
    this(string q) {
         result = c_query(toStringz(q));
         if(!empty) popFront();
    }

    Row front;
    @property bool empty() { return HasRow(result); }
    void popFront() in { assert(!empty); } body {
         front = GetNextRow(result);
    }
}


It is certainly a bit longer, but it isn't that bad, and is easily extended to other range capabilities.


Translating recursive iteration to a range does take a bit more, you need to track your local variables and put them in a stack of your own, but even that isn't too hard (though a bit wordier).


I guess the whole yield thing can be kinda nice, I'm just not sure it is that big of a win given its other limitations compared to full ranges.

Reply via email to