On 01/24/2013 08:03 PM, Artur Skawina wrote:
...

Having said that, I'll elaborate on the sentence you quoted above. See for 
example
Timon's code [1] here: http://dpaste.dzfl.pl/baa538af . Spot the recursion in 
the
tree-walker. This is an example of the kind of abuse of parens-less calls that 
an
unsuspecting programmer shouldn't have to deal with. Sure, in this case it's 
simple
enough, but in more complex scenarios, where the 'inorder' field/method/ufcs
definition is not readily available, it would be extremely misleading. It's not
reasonable to expect everyone reading the code to check every single object 
field
access, just in case the previous coder decided that the source looked "cuter"
w/o the '()'.
...

Uh...

class Tree(T){
    InOrder!T inorder;
    this(){inorder = InOrder!T(this); }
    Tree!T l,r;
    T v;
}
auto tree(T)(Tree!T l, T v, Tree!T r){
    auto t = new Tree!T;
    t.l=l;t.r=r;t.v=v;
    return t;
}
auto tree(T)(T v){ return tree(Tree!T.init,v,Tree!T.init); }
struct InOrder(T){
    this(Tree!T c){container=c;}
    Tree!T container;
    InOrder* t;
    mixin Yield!(q{
        if (container.l !is null){
            for(t=[container.l.inorder].ptr;!t.empty;t.popFront())
                yield t.front;
        }
        yield container.v;
        if (container.r !is null){
            for(t=[container.r.inorder].ptr;!t.empty;t.popFront())
                yield t.front;
        }
    },T);
}
//InOrder!T inorder(T)(Tree!T container){ return InOrder!T(container); }

Reply via email to