Positive
KennyTM~
kennytm at gmail.com
Sun Oct 5 05:12:31 PDT 2008
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 :)
More information about the Digitalmars-d
mailing list