Should this work?

H. S. Teoh hsteoh at quickfur.ath.cx
Thu Jan 9 12:27:11 PST 2014


On Thu, Jan 09, 2014 at 06:25:33PM +0000, Brad Anderson wrote:
> On Thursday, 9 January 2014 at 14:08:02 UTC, Manu wrote:
[...]
> >On a side note, am I the only one that finds
> >std.algorithm/std.range/etc for string processing really obtuse?  I
> >can rarely understand the error messages, so say it's better than STL
> >is optimistic.
> 
> I absolutely hate the "does not match any template declaration"
> error. It's extremely unhelpful for figuring out what you need to do
> and anytime I try to do something fun with ranges I can expect to
> see it a dozen times.

Yeah, that error drives me up the wall too. I often get screenfuls of
errors, dumping 25 or so overloads of some obscure Phobos internal
function (like toImpl) as though an end-user would understand any of it.
You have to parse all the sig constraints (and boy some of them are
obscure), *understand* what they mean (which requires understanding how
Phobos works internally), and *then* try to figure out, by elimination,
which is the one that you intended to match, and why your code failed to
match it.

I'm almost tempted to say that using sig constraints to differentiate
between template overloads is a bad idea. Instead, consider this
alternative implementation of toImpl:

	template toImpl(S,T)
		// N.B.: no sig constraints here
	{
		static if (... /* sig constraint conditions for overload #1 */)
		{
			S toImpl(T t)
			{
				// implementation here
			}
		}
		else static if (... /* sig constraint conditions for overload #2 */)
		{
			S toImpl(T t)
			{
				// implementation here
			}
		}
		...
		else // N.B.: user-readable error message
		{
			static assert(0, "Unable to convert " ~
				T.stringof ~ " to " ~ S.stringof);
		}
	}

By putting all overloads inside a single template, we can give a useful
default message when no overloads match.

Alternatively, maybe sig constraints can have an additional string
parameter that specifies a message that explains why that particular
overload was rejected. These messages are not displayed if at least one
overload matches; only if no overload matches, they will be displayed
(so that the user can at least see why each of the overloads didn't
match).


[...]
> >I also find the names of the generic algorithms are often unrelated
> >to the name of the string operation.  My feeling is, everyone is
> >always on about how cool D is at string, but other than 'char[]', and
> >the builtin slice operator, I feel really unproductive whenever I do
> >any heavy string manipulation in D.

Really?? I find myself much more productive, because I only have to
learn one set of generic algorithms, and I can use them not just for
strings but for all sorts of other stuff that implement the range API.
Whereas in languages like C, sure you get familiar with string-specific
functions, but then when you need a similar-operating function for an
array of ints, you have to name it something else, and then basically
the same algorithm reimplemented for linked lists, called by yet another
name, etc.. Added together, it's many times more mental load than just
learning a single set of generic algorithms that work on (almost)
everything.

The composability of generic algorithms also allow me to think on a more
abstract level -- instead of thinking about manipulating individual
chars, I can figure out OK, if I split the string by "," then I can
filter for the strings I'm looking for, then join them back again with
another delimiter. Since the same set of algorithms work with other
ranges too, I can apply exactly the same thought process for working
with arrays, linked lists, and other containers, without having to
remember 5 different names of essentially the same algorithm but applied
to 5 different types.


> I actually feel a lot more productive in D than in C++ with strings.
> Boost's string algorithms library helps fill the gap (and at least
> you only have one place to look for documentation when you are using
> it) but overall I prefer my experience working in D with
> pseudo-member chains.

I found that what I got out of taking the time to learn std.algorithm
and std.range was worth far more than the effort invested.


T

-- 
Claiming that your operating system is the best in the world because more people use it is like saying McDonalds makes the best food in the world. -- Carl B. Constantine


More information about the Digitalmars-d mailing list