foreach (x; a .. b) and foreach_reverse (x; a .. b) should be
Jason House
jason.james.house at gmail.com
Mon May 18 05:46:42 PDT 2009
grauzone Wrote:
> Robert Fraser wrote:
> > Jason House wrote:
> >> Andrei Alexandrescu Wrote:
> >>
> >>> Consider:
> >>>
> >>> foreach (x; 1.0 .. 4.1) writeln(x);
> >>> foreach_reverse (x; 1.0 .. 4.1) writeln(x);
> >>>
> >>> This sucks. foreach with interval for floating-point types should be
> >>> disallowed.
> >>>
> >>>
> >>> Andrei
> >>
> >> I agree that makes little sense.
> >>
> >> I'm curious, why the sudden pruning of features? Can you please
> >> consider removing SFINAE? I'd also love to see is expressions go the
> >> way of the dinosaur. I don't know what their replacement should look
> >> like, but there _has_ to be a better and less error prone syntax!
> >
> > I agree about SFINAE, but what's so bad about is()? If it does get
> > removed, I hope whatever replaces it can do all the weird things is can
> > (e.x. is(typeof({}())))
>
> Isn't is() also a kind of SFINAE? SFINAE is Substitution Failure Is Not
> An Error (or so). That means, if there's an error trying to apply a
> template, the error is silently ignored, and the compiler tries the next
> template declaration. (Correct me if I'm wrong.) is() does something
> similar: it tries to compile the expression inside is(), and if it
> fails, the compiler silently ignores the error and returns "false" to
> the if.
>
> The problem is: you can't really know if that what you intended to test
> with is() was false, or if another random semantic error happened inside
> the is() expression.
>
> Look at this for example:
> > writefln("%s", is(typeof(rtzx) == char));
> This compiles even if rtzx doesn't exist. But you probably wanted to
> check the type of rtzx, not it if rtzx exists. If you mistyped rtzx, the
> compiler will never tell you.
>
> Now Andrei didn't really explain his problem with is()...
Andrei didn't voice a complaint about is expressions. I did. If you take a look at the documentation on them, you'll see 8 different flavors. Can you honestly reproduce that list without looking it up? Here's a hint: is(typeof(...)) isn't listed in the docs. Here's a simpler question: how do you test for an associative array of string types indexes by a numerical type while exposing a type alias for the index type?
Here's a recent misuse by Andrei that made its way into Phobos:
if (is(T == struct) && is(T.toString))
More information about the Digitalmars-d
mailing list