On Tuesday, 17 December 2013 at 14:36:38 UTC, Marco Leise wrote:
> boolean result, so why does among have to return an index > instead of a
> boolean true/false?

More info is better than less info, especially if it comes for free. We already use this idiom in a couple of places in Phobos.

But it might not be free if the backend is incapable of reducing it because it lacks information. Sometimes just using gotos can lead to faster code (if they disappear in the IR of the backend after loop-unrolling). So testing and tweaking on different backends is kind of important (removing structures that inhibit optimization).

Some CPUs also will generate 1 as true for you when doing tests, which you in turn can use for indexing to avoid branching, so what is free depends on the hardware…

I've always preferred findCharInString() to return the "end"
of the string in case the char isn't found instead of e.g. -1,
for two reasons:

a) With an index to the end (equal to the length) you can do
   more useful stuff like:

   auto idx = findCharInString(' ', str);
   str = str[idx .. $];

Yep, that is neat, but then you really should name the function indexOfCharOrEnd() so you can forget about it when you look at the code again. I personally prefer to have boolean alternatives, I find the code becomes more readable. And it is sometimes easier to optimize a decision-problem than a search-problem.

Still, what is useful depends on what is the common case. When writing string validators I just want exceptions and don't even care about the result, because the code becomes very easy to maintain that way. The result is implied by being able to proceed to the next line:

validate_number(record.age);
validate_email(record.email);
database.store(record);

Reply via email to