Automatic typing

Ary Borenszweig ary at esperanto.org.ar
Mon Jul 1 06:44:45 PDT 2013


On 6/30/13 10:56 PM, Timon Gehr wrote:
> On 07/01/2013 03:08 AM, Kenji Hara wrote:
>> 2013/7/1 JS <js.mdnq at gmail.com <mailto:js.mdnq at gmail.com>>
>>
>>     I am simply talking about having the compiler enlarge the type if
>>     needed. (this is mainly for built in types since the type hierarchy
>>     is explicitly known)
>>
>>
>> Just a simple matter, it would *drastically* increase compilation time.
>>
>> void foo()
>> {
>>      auto elem;
>>      auto arr = [elem];
>>
>>      elem = 1;
>>      ....
>>      elem = 2.0;
>>      // typeof(elem) change should modify the result of typeof(arr)
>> }
>>
>> Such type dependencies between multiple variables are common in the
>> realistic program.
>>
>> When `elem = 2.0;` is found, compiler should run semantic analysis of
>> the whole function body of foo _once again_, because the setting type of
>> elem ignites the change of typeof(arr), and it would affect the code
>> meaning.
>>
>> If another variable type would be modified, it also ignites the whole
>> function body semantic again.
>>
>> After all, semantic analysis repetition would drastically increase.
>>
>> I can easily imagine that the compilation cost would not be worth the
>> small benefits.
>>
>> Kenji Hara
>
> The described strategy can easily result in non-termination, and which
> template instantiations it performs can be non-obvious.
>
> auto foo(T)(T arg){
>      static if(is(T==int)) return 1.0;
>      else return 1;
> }
>
> void main(){
>      auto x;
>      x = 1;
>      x = foo(x);
> }

Just tried it in Crystal and it ends alright. It works like this:

1. x is an Int
2. you call foo(x), it returns a float so x is now a float (right now in 
Crystal that's a union of int and float, but that will soon change).
3. Since x is a float, foo returns an int, but assigning it to x, which 
is already a float, gives back a float.
4. No type changed, so we end.

Crystal also supports recursive and mutuilly recursive functions. The 
compiler is always guaranteed to finish.

(I'm just using Crystal as an example to have a proof that it can be done)


More information about the Digitalmars-d mailing list