Positive
KennyTM~
kennytm at gmail.com
Sun Oct 5 07:27:23 PDT 2008
Andrei Alexandrescu wrote:
> KennyTM~ wrote:
>> Bruce Adams wrote:
>>> On Sun, 05 Oct 2008 11:18:24 +0100, KennyTM~ <kennytm at gmail.com> wrote:
>>>>
>>>> Probably they'd used (0, +∞) and [0, +∞) instead.
>>>>
>>>> ---
>>>>
>>>> BTW, negative real numbers can also be indicated as ℝ⁻ (R^- if
>>>> Unicode is not supported). Is it now special enough to deserve a
>>>> Negative!() template? :p
>>>
>>> Nice use of unicode.
>>>
>>>>
>>>> I think these sign checking should be done through contracts or
>>>> "conditional template" (? whatever it's called; I haven't used one
>>>> of these yet) instead. Unless you can runtime check that
>>>>
>>>> Positive!(double) x = 6;
>>>> Positive!(double) y = 12;
>>>
>>> Compile time check
>>>
>>>> Positive!(double) z = void;
>>>
>>> This must be an syntax error surely?
>>
>> type x = void; means don't initialize x. Or have I missed something?
>>
>>>
>>>> z = x - y; // raises error.
>>>
>>> The return type of subtraction goes outside the postive domain:
>>> i.e. if it needed to exist (which it probably doesn't) the function
>>> spec would be:
>>>
>>> double opMinus(Positive!(double) y, Positive!(double) y);
>>>
>>>
>>> So this is actually:
>>>
>>> z = cast(Positive!(double))(x - y)
>>>
>>> Hence there is the necessary check which could be either run-time or
>>> compile time.
>>>
>>
>> Most of the time it can't be compile time because if I've initialized
>> x and y to be some runtime-dependent function (e.g. sin(current time))
>> then you can't be sure of the sign of x-y. So the check must be made
>> into runtime unless the expression can be CTFE-ed.
>>
>>>
>>>> Positive!(double) w;
>>>> din.readf("%g", &w); // raises error if user enters negative
>>>> number.
>>>>
>>>> But I don't think uint, etc now even do these checks.
>>>
>>> This would ideally work as above but I see your problem.
>>> The contract of readf is not tight enough. You should rewrite as:
>>>
>>> double wtemp;
>>> din.read("%g", &wtemp);
>>> Positive!(double) w = wtemp; // type check applied here
>>>
>>
>> But this is getting ugly :)
>
> Of course. It's because it uses the "!". :o)
>
> Andrei
I mean using temporary variable explicitly is ugly -_-
More information about the Digitalmars-d
mailing list