No more implicit conversion real->complex?!
Sean Kelly
sean at f4.ca
Tue Mar 21 11:41:42 PST 2006
kris wrote:
> Don Clugston wrote:
>> kris wrote:
>>
>>> Don Clugston wrote:
>>>
>>>> Norbert Nemec wrote:
>>>>
>>>>> I just notice that as of D 0.150, implicit conversion from
>>>>> real/imaginary to complex does not work any more. I could not make out
>>>>> the message containing the suggestion by Don Clugston, so I'm not sure
>>>>> about the rationale.
>>>>>
>>>>> In any case: if this conversion does not work implicitely any more, I
>>>>> wonder whether I understand the rule which conversions do?
>>>>> real->complex
>>>>> is possible without ambiguities or loss of information. Why not
>>>>> make it
>>>>> implicit?
>>>>
>>>>
>>>>
>>>> It's not 100% unambiguous, there are two possible conversions
>>>> 7.2 -> 7.2 + 0i
>>>> and 7.2 -> 7.2 - 0i.
>>>>
>>>> OK, it's not a big deal. But the real problem is that with that
>>>> implicit conversion in place, overload resolution is a real nuisance.
>>>>
>>>> Consider
>>>> creal sin(creal c);
>>>> real sin(real x);
>>>>
>>>> writefln( sin(3.2) );
>>>>
>>>> Now, 3.2 is a double, so it tries to find sin(double).
>>>> This fails, so it tries implicit conversions.
>>>> Both sin(creal) and sin(real) are possible, so it's ambiguous, and
>>>> compilation will fail.
>>>> Up to now, the only way of overcoming this was to supply seperate
>>>> functions for float, double, real, and creal arguments. This is
>>>> clumsy, and becomes impractical once multiple arguments are used.
>>>>
>>>>> I think this is an important issue: in numerics, mixing of real and
>>>>> complex values happens all the time, therefore it should be as
>>>>> simple as
>>>>> possible.
>>>>
>>>>
>>>>
>>>> I agree. But the implicit conversions were actually making mixing of
>>>> real and complex functions much more difficult. It would be good to
>>>> have someone other than me seriously thinking about these issues,
>>>> and gaining some experience with numerics in D.
>>>
>>>
>>> By this argument, if the overloaded types were char and long (instead
>>> of creal & real) then D should not allow implicit conversion there?
>>
>>
>> I can't think of many examples where you have overloads of both char
>> and long. But it's _extremely_ common for complex functions to be
>> overloads of real functions. Let's not forget that the purpose of
>> implicit conversions is for convenience. IMHO, real->creal fails to be
>> convenient, given the D's simple lookup rules.
>>
>
> Yes, Don, but isn't that a question of extent? You argue, reasonably,
> for a distinction between creal & real. Surely the same argument can be
> used to distinguish between a UTF8 char and a signed 64-bit integer? I
> mean, the latter two are of significantly different type, with quite
> distinct intent. Isn't it just as inconvenient to have those bumping
> into each other?
Yes :-) However, there may be compatibility reasons to support the char
conversion, as C does as well.
Sean
More information about the Digitalmars-d
mailing list