First experience with std.algorithm: I had to resort to writing a 'contains' function.

Steven Schveighoffer schveiguy at yahoo.com
Tue Jun 8 06:45:57 PDT 2010


On Tue, 08 Jun 2010 07:23:39 -0400, Bernard Helyer <b.helyer at gmail.com>  
wrote:

> So I'm writing a compiler, and I wanted to create a list of TokenTypes  
> (an enum) and check to see if the current token is among them. 'A-ha!',  
> says I, 'I'll use std.algorithm!' (as I hadn't tried it really, yet,  
> except for playing around)
> So I look it up, and find 'find'. It returns an iterated range, or an  
> empty range on failure. A little funky, but that's okay, I can swing it!
>
> immutable TokenType[] someList = [TokenType.Foo, TokenType.Bar];
>
> ...
>
> while (find(someList, tokenStream.peek.type) != []) {
>     doStuff();
> }
>
> If I have unittests on, this assert is triggered:
>
> static assert(is(typeof(s) == Tuple!(string, float)));
>
> I didn't at first, so I got another error. So I looked closer at the  
> documentation, and it turns out it needs an input range, and that needs  
> popFront! Well, it can't popFront an immutable range, so I dropped  
> immutable, and decided to let convention and TLS sort the rest out!

This should be filed as a bug.  find should be able to strip the immutable  
part from the array length itself since immutable T[] implicitly casts to  
immutable(T)[].  I think this should be special cased.

For custom ranges, it's not as easy, but array should be supported as well  
as is possible.

>
> This worked. Until I turned unittests on, and the assert I showed above  
> tripped. At this point my language turned rather unpleasant and I wrote  
> this:
>
> bool contains(T)(const(T)[] l, T a)
> {
>       foreach(e; l) {
>           if (a == e) {
>              return true;
>           }
>       }
>       return false;
> }
>
> And my problems went away. I assume what I experienced is a bug, but I'm  
> not sure, so I thought I'd share my experience.

As D2 nears release, and is used more and more, I'm sure we will find many  
problems.  It's sort of a chicken-and-egg thing, people don't want to use  
D2 because it's changing so much, but when nobody uses it, nobody finds  
any bugs until it's finalized!  I suspect at least one more change to  
const is necessary to take away the pain :)

-Steve


More information about the Digitalmars-d mailing list