either

Tomek Sowiński just at ask.me
Sun Jan 9 13:13:40 PST 2011


Andrei Alexandrescu napisał:

> Aha, so this encodes the predicate in the operation. With a general 
> predicate, that would be:
> 
> if (any!"a != b"(expr, 1, 2, 5)) { ... }
> 
> The advantage over
> 
> if (expr != 1 || expr != 2 || expr != 5)) { ... }
> 
> is terseness and the guarantee that expr is evaluated once (which is 
> nice at least for my code).

Yes.

> This looks promising and well integrated with the rest of Phobos. Should 
> I add it?

Please do. Oh, thinking about it 10 more minutes, an improvement struck me:

bool any(alias pred = "a==b", E, Ts...)(E e, Ts args) if(Ts.length > 1 || !isTuple!Ts) {
     foreach (a; args)
         if (binaryFun!pred(a, e))
            return true;
     return false;
}

unittest
{
     assert(!"abac".any("s"));
     assert(!"abac".any("aasd", "s"));
     assert("abac".any("aasd", "abac", "s"));
}

/// Unpacks a single tuple.
bool any(alias pred = "a==b", E, T)(E e, T t) if(isTuple!T) {
    return any!(pred, E, T.Types)(e, t.field);
}

unittest
{
     assert(any("abac", tuple("aasd", "abac", "s")));
     assert(find!any([5,3,7,9,4,5,7], tuple(2,4,6)) == [4,5,7]);    // cool!
}

> And if I do, is "any" the name?

For a start. We can always vote it to sth more descriptive e.g. 'isAny' in case 'any' turns out misleading.

-- 
Tomek



More information about the Digitalmars-d mailing list