No more implicit conversion real->complex?!

kris foo at bar.com
Tue Mar 21 10:12:07 PST 2006


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?

Suffixes can conceivably be used to disambiguate the utf8/long case, 
yet, surely that same approach could be applied to creal vs real? 
Alternatively, one might argue that suffixes themselves are entirely 
inconvenient. They are certainly not clear to a 'novice' (what with all 
the talk of D as a first language), and can become confusing to an 
'expert' too ~ especially, I imagine, when maintaining someone else's code?

I think what you pointed out here is that type coercion (as it stands) 
should probably only work for a few select types, where it actually 
makes sense. Walter has now changed the compiler to abolish 
type-coercion for real/creal; should this trend not continue to other 
types, where it makes sense to do so? Otherwise, shouldn't the change 
have been to apply suffix-distinction in the cases you talk about?

Unfortunately, this opens up the whole type-selection concern regarding 
arguments of the literal variety, of any type, within D. A concern that 
keeps coming up :-)



More information about the Digitalmars-d mailing list