Re: meta-comment on typing
bear 16 Oct 2005 19:37 UTC
On Thu, 6 Oct 2005, Marcin 'Qrczak' Kowalczyk wrote:
>Per Bothner <xxxxxx@bothner.com> writes:
>
>> Since it *optional* static typing, I'm assuming that the specific
>> operations are "consistent" in the sense of the following example:
>>
>> If (and (fixnum? x) (fixnum? y))
>> then: (eqv? (+ x y) (fx+ x y))
>
>It's not the same: (fx+ x y) returns a fixnum even if it overflows.
I think the consistency Per was asking about (correct me if
I'm wrong) might be more completely expressed as:
If (and (fixnum? x) (fixnum? y) (fixnum? (+ x y)))
Then (eqv? (+ x y) (fx+ x y)
Because +, even on integer-only arguments, has to deal with several
possibilities:
Case 1: one or more arguments are bignums, but the result is fixnum.
example: (+ (! 1000) (* (! 1000) -1))
Case 2: one or both arguments are bignums and the result is bignum.
example: (+ (! 1000) (! 1000))
Case 3: both arguments are fixnum but the result is bignum.
example: (+ MAXFIXNUM 22)
Case 4: both arguments are fixnum and the result is also fixnum.
example: (+ 22 0)
fx+, as I understand it, is specified to give the same results
as + only in case 4. Calling fx+ in cases 1,2,3 would be an error
and result in unspecified behavior.
Bear