foreach (x; a .. b) and foreach_reverse (x; a .. b) should be disallowed

grauzone none at example.net
Sun May 17 22:06:19 PDT 2009


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()...



More information about the Digitalmars-d mailing list