No more implicit conversion real->complex?!
Rioshin an'Harthen
rharth75 at hotmail.com
Tue Mar 21 04:24:16 PST 2006
"Don Clugston" <dac at nospam.com.au> wrote in message
news:dvoklp$2pmq$2 at digitaldaemon.com...
> Rioshin an'Harthen wrote:
>> "Don Clugston" <dac at nospam.com.au> wrote in message
>> news:dvobhe$2cm6$1 at digitaldaemon.com...
>>
>> I've been thinking about this ever since the last discussion about this,
>> and believe there might be a better solution to the problem at hand than
>> disabling real -> creal implicit conversions.
>>
>> Since the compiler knows the storage requirements of the different types,
>> and if multiple implicit conversions are possible (e.g. the above
>> mentioned sin( creal ) and sin( real )), why not make the compiler choose
>> the one with the least storage requirement (i.e. changing the original
>> number the least).
>>
>> So if we have
>>
>> creal sin( creal c );
>> real sin( real r );
>>
>> writefln( sin( 3.2 ) );
>>
>> as above, the 3.2 is according to specs a double, and we don't find
>> double sin( double d ) anywhere, we try implicit conversions. Now, we
>> have two options: creal sin( creal c ) and real sin( real r ). The
>> storage requirement of creal is larger than that of real, so conversion
>> to real changes the original double less than conversion to creal. Thus,
>> the compiler chooses to convert it into real.
>>
>> Naturally, we can help the compiler make the choice:
>>
>> writefln( sin( cast( creal ) 3.2 ) );
>>
>> would naturally pick the creal version (since 3.2 has been cast to it).
>>
>> What are your thoughts about this? Could this work? And if this could,
>> should this be added to the D specifications?
>
> This would mean the lookup rules become more complicated. I think Walter
> was very keen to keep them simple.
I doubt they'd become that much more complicated. Currently, the DMD
compiler has to look up all the possible implicit conversions, and if
there's more than one possible conversion, error out because it can't know
which one.
Now, since it knows the types in question - and the type of the value being
passed to the function, it's not that much more to do, IMHO. Basically, if
it would error with an amiguous implicit conversion, do a search of the
minimum of the possible types that are larger than the current type. If this
doesn't match any type, do the error, otherwise select the type. A simple
search during compile time is all that's required if we encounter more than
one possible implicit conversion, to select the one that is the smallest of
the possible ones.
Approximately (in some kind of pseudo-code):
type tryImplicitConversion( type intype, type[] implicit_conversion )
{
least_type = illegal_type; // illegal type, if we can't find any other -
size is defined as
// maximum
foreach( type in implicit_conversion )
{
if( intype.sizeof > type.sizeof )
continue; // we're not interested in types that are *less* in
size than our
// input type
if( least_type.sizeof < type.sizeof )
continue; // nor are we interested in larger types than
necessary
least_type = type; // ok, this is the smallest type we can convert
to
// (we've found so far)
}
return least_type;
}
More information about the Digitalmars-d
mailing list