Automatic typing

JS js.mdnq at gmail.com
Mon Jul 1 19:35:37 PDT 2013


On Tuesday, 2 July 2013 at 02:15:09 UTC, Andrei Alexandrescu 
wrote:
> On 7/1/13 6:29 PM, JS wrote:
>> Would would be nice is an experimental version of D where 
>> would could
>> easily extend the language to try out such concepts to see if 
>> they truly
>> are useful and how difficult to implement. e.g., I could 
>> attempt to add
>> said "feature", it could be merged with the experimental 
>> compiler, those
>> interested can download the compiler and test the feature 
>> out... all
>> without negatively affecting D directly. If such features 
>> could be
>> implemented dynamically then it would probably be pretty 
>> powerful.
>
> I don't think such a feature would make it in D, even if the 
> implementation cost was already sunken (i.e. an implementation 
> was already done and one pull request away).
>
> Ascribing distinct objects to the same symbol is a very core 
> feature that affects and is affected by everything else. We'd 
> design a lot of D differently if that particular feature were 
> desired, and now the fundamentals of the design are long 
> frozen. For a very simple example, consider:
>
> auto a = 2.5; // fine, a is double
> ...
> a = 3;
>

No, not under what I am talking about. You can't downgrade a 
type, only upgrade it. a = 3, a is still a float. Using the 
concept I am talking about, your example does nothing new.

but reverse the numbers:

auto a = 3;
a = 2.5;

and a is now a float, and your logic then becomes correct EXCEPT 
a is expanded, which is safe.

I really don't know how to make it any clearer but I'm not sure 
if anyone understands what I'm talking about ;/



> By the proposed rule a will become an entirely different 
> variable of type int, and the previous double variable would 
> disappear. But current rules dictate that the type stays 
> double. So we'd either have an unthinkably massive breakage, or 
> we'd patch the language with a million exceptions.
>
> Even so! If the feature were bringing amazing power, there may 
> still be a case in its favor. But fundamentally it doesn't 
> bring anything new - it's just alpha renaming; it doesn't 
> enable doing anything that couldn't be done without it.
>
>

Expanding a type is always valid because it just consumes more 
memory. A double can always masquerade as an int without issue 
because one just wastes 4 bytes. An int can't masquerade as a 
double because any function think uses it as a double will cause 
corruption of 4 bytes of memory.

(I'm ignoring that a double and int use different cpu 
instructions. This is irrelevant unless we are hacking stuff up)


The simplest example I can give is:

auto x = 2;
x = 2.5;

x IS a double, regardless of the fact that auto x = 2; makes it 
look like an int BECAUSE that is how auto currently is 
defined(which might be the confusion).

The reason is, that the compiler looked at the scope for all 
assignments to x and was able to determine automatically that x 
needed to be a double.


I'll give one more way to look at this, that is a sort of 
inbetween but necessary logical step:

We have currently that auto looks at the immediate assignment 
after it's keyword to determine the type, correct?

e.g.,

auto x = 3;

What if we allow auto to look at the first assignment to x, not 
necessarily the immediate assignment, e.g.:

auto x;
x = 3;

(should be identical to above)

or

auto x;
.... (no assignments to x)
x = 3;

All this should be semantically equivalent, correct? To me, the 
last case is more powerful since it is more general. Of course, 
one could argue that it makes it more difficult to know the type 
of x but I doubt this would be a huge issue.




More information about the Digitalmars-d mailing list