On Monday, July 09, 2012 22:09:54 Jacob Carlborg wrote: > Almost every time I'm trying to use std.algorithm I run into some kind > of error, for what seems to be fairly trivial and what one would expect > to work. It feels like I'm constantly fighting with std.algorithm. For > example: > > import std.algorithm; > import std.range; > > struct Foo {} > > auto f = Foo(); > auto foos = [f]; > auto foo = foos.map!(x => "foo"); > auto bar = foo.chain("bar"); > > This simple example result in the follow error: > > http://pastebin.com/E4LV2UBE > > Another example: > > auto str = ["foo", "bar"].map!(x => x); > auto f = str.sort(); > > Results in: > > http://pastebin.com/BeePWQk9 > > I'm using DMD 2.059.
>From the looks of it (without digging into what's really going on), in both cases, the problem seems to be that a template constraint is insufficiently precise, and so it's attempting to instantiate a template when that instantiation should fail. If a template constraint is written correctly, it should be impossible for the template constraint to succeed and the template instantiation fail. In general, I think that std.range and std.algorithm need better unit tests (ideally with every combination of range types that a particular function is supposed to work with being tested for that function). There are definitely cases where certain range types are supposed to work and don't (reference type ranges being a prime example). I've started on that but haven't gotten all that far yet. But with better testing, it should be much harder for a bad template constraint to be missed. - Jonathan M Davis