either

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Jan 9 12:18:30 PST 2011


On 1/9/11 1:12 PM, Daniel Gibson wrote:
> Am 09.01.2011 19:48, schrieb Robert M. Münch:
>> On 2011-01-09 19:42:22 +0100, Andrei Alexandrescu said:
>>
>>> I wrote a simple helper, in spirit with some recent discussions:
>>
>> Hi, EITHER normaly means: This or that, so it's more like an IF/ELSE.
>> How about ANY? IMO
>>
>> 1==any(1, 2, 3)
>>
>> describes pretty good what is meant.
>>
>
> I agree.

Problem with any/either is that it encodes the comparison inside the 
data. You can do == and !=, but algorithms want to work with general 
predicates, and any can't work with arbitrary predicates - unless the 
predicates themselves are designed to work with it.

For now I added this to std.algorithm:

/**
Consume all elements from $(D r) that are equal to one of the elements
$(D es).
  */
void skipAll(alias pred = "a == b", R, Es...)(ref R r, Es es)
{
   loop:
     for (; !r.empty; r.popFront())
     {
         foreach (i, E; Es)
         {
             if (binaryFun!pred(r.front, es[i]))
             {
                 continue loop;
             }
         }
         break;
     }
}

unittest
{
     auto s1 = "Hello world";
     skipAll(s1, 'H', 'e');
     assert(s1 == "llo world");
}

I wonder if it's worthwhile encoding the predicate inside the compared 
elements. In that case, any would return a type that also has the 
predicate. Something like this:

struct Any(alias pred = "a == b", Es...) { ... }

Then you'd put the predicate by the call to any, not by the call to the 
algorithm:

skipAll(r, any!"a > b"(x, y, z));

Then skipAll doesn't need to worry about the predicate - it just uses == 
and !=.

If this paradigm has a landslide advantage over the current structure, 
we'd need to rewrite a lot of std.algorithm.


Andrei


More information about the Digitalmars-d mailing list