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