On Tue, 08 Jun 2010 23:23:39 +1200, Bernard Helyer wrote: > [...] > > 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!
Actually, there is no reason this shouldn't be possible. This works: import std.array: popFront; immutable(int)[] tail(immutable(int)[] list) { list.popFront(); return list; } void main() { immutable a = [0, 1, 2, 3]; assert (tail(a) == [1, 2, 3]); } The problem is that find()'s parameters are templated, so when you give it an immutable(int[]), it doesn't know it's safe to treat it as an immutable(int)[]. find() should probably be improved to allow this. I'm sure this won't be the last time someone tries to search an immutable array. -Lars