No more implicit conversion real->complex?!
kris
foo at bar.com
Wed Mar 22 10:41:53 PST 2006
Don Clugston wrote:
> kris wrote:
>
>> Sean Kelly wrote:
>>
>>> 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
>>
>>
>> Aye. There's always some excuse for a lack of consistency :-)
>>
>> Even then, one might argue that "compatability" is actually there in
>> name only. Why would anyone convert a C program to D? I've yet to see
>> an extensive example of that; no doubt due to the extensive
>> /incompatability/ of D with .h files (in truth, I haven't seen any
>> examples)
>>
>> Thus the nobility of "C compatability" is perhaps just a bit thin?
>> Wouldn't it be nice to tidy some of this up while the opportunity
>> presents itself?
>> - Kris
>
>
> I think you're right. I think the "C compatibility" argument is relevant
> only for cases where changes would be very common and hard to track down.
> (FWIW, I've converted the Cephes math libraries from C to D. In every
> case, the tighter D language rules improved the code).
>
> I haven't done much work with char/wchar/dchar in D, so I don't have
> much idea of how troublesome the implicit conversions are. Undoubtedly
> you have the most experience here. If you're also finding them to be a
> nuisance rather than a convenience, we should
It has been a nuisance, but (so far) less than the trouble caused by
string literals (which is pretty awful)
In retrospect, it's a shame they weren't called utf8, utf16, and utf32
from the start. Char would have little reason to exist at that point;
only byte/ubyte.
> It does seem to me that implicit widening conversions are nearly always
> helpful, but those ones that change the semantics (wchar->short,
> real->creal, etc) seem much more likely to be annoying. I particularly
> dislike conversions that silently insert code.
Agreed. Although "annoying" is perhaps is bit light-hearted for what
happens in reality :-)
>
> The suggestion was made to have two levels of implicit conversion,
> roughly similar to the promotion rules, ie:
>
> * exact match
> * match with implicit widening conversions
> * match with implicit semantic-changing conversions.
>
> Would this improve the situation for char/int conversions?
I wouldn't doubt it. Something similar would probably fix the problem
with string literals also? (although, I believe there's an easier and
more consistent way to resolve the latter).
More information about the Digitalmars-d
mailing list