diff --git a/scheme/ikarus.fixnums.ss b/scheme/ikarus.fixnums.ss index 8e75213..212b4ec 100644 --- a/scheme/ikarus.fixnums.ss +++ b/scheme/ikarus.fixnums.ss @@ -417,3 +417,64 @@ ) + +(library (ikarus fixnums div-and-mod) + (export fxdiv fxmod fxdiv-and-mod) + (import + (ikarus system $fx) + (except (ikarus) fxdiv fxmod fxdiv-and-mod)) + + (define ($fxdiv-and-mod n m) + (let ([d0 ($fxquotient n m)]) + (let ([m0 ($fx- n ($fx* d0 m))]) + (if ($fx>= m0 0) + (values d0 m0) + (if ($fx>= m 0) + (values ($fx- d0 1) ($fx+ m0 m)) + (values ($fx+ d0 1) ($fx- m0 m))))))) + + (define ($fxdiv n m) + (let ([d0 ($fxquotient n m)]) + (if ($fx>= n ($fx* d0 m)) + d0 + (if ($fx>= m 0) + ($fx- d0 1) + ($fx+ d0 1))))) + + (define ($fxmod n m) + (let ([d0 ($fxquotient n m)]) + (let ([m0 ($fx- n ($fx* d0 m))]) + (if ($fx>= m0 0) + m0 + (if ($fx>= m 0) + ($fx+ m0 m) + ($fx- m0 m)))))) + + (define (fxdiv-and-mod x y) + (if (fixnum? x) + (if (fixnum? y) + (if ($fx= y 0) + (error 'fxdiv-and-mod "division by 0") + ($fxdiv-and-mod x y)) + (error 'fxdiv-and-mod "not a fixnum" y)) + (error 'fxdiv-and-mod "not a fixnum" x))) + + (define (fxdiv x y) + (if (fixnum? x) + (if (fixnum? y) + (if ($fx= y 0) + (error 'fxdiv "division by 0") + ($fxdiv x y)) + (error 'fxdiv "not a fixnum" y)) + (error 'fxdiv "not a fixnum" x))) + + (define (fxmod x y) + (if (fixnum? x) + (if (fixnum? y) + (if ($fx= y 0) + (error 'fxmod "modision by 0") + ($fxmod x y)) + (error 'fxmod "not a fixnum" y)) + (error 'fxmod "not a fixnum" x))) + ) + diff --git a/scheme/makefile.ss b/scheme/makefile.ss index ceea782..7e604ad 100755 --- a/scheme/makefile.ss +++ b/scheme/makefile.ss @@ -788,8 +788,8 @@ [fxbit-set? r fx] [fxcopy-bit r fx] [fxcopy-bit-field r fx] - [fxdiv r fx] - [fxdiv-and-mod r fx] + [fxdiv i r fx] + [fxdiv-and-mod i r fx] [fxdiv0 r fx] [fxdiv0-and-mod0 r fx] [fxeven? i r fx] @@ -799,7 +799,7 @@ [fxlength r fx] [fxmax i r fx] [fxmin i r fx] - [fxmod r fx] + [fxmod i r fx] [fxmod0 r fx] [fxnegative? i r fx] [fxnot i r fx] diff --git a/scheme/run-tests.ss b/scheme/run-tests.ss index 8318fac..94e54cd 100755 --- a/scheme/run-tests.ss +++ b/scheme/run-tests.ss @@ -24,6 +24,7 @@ (tests hashtables) ;(tests numbers) (tests bignums) + (tests fixnums) (tests fxcarry) (tests bignum-to-flonum) (tests string-to-number) @@ -60,4 +61,5 @@ (test-bignum-conversion) (test-fldiv-and-mod) (test-fldiv0-and-mod0) +(test-fxdiv-and-mod) (printf "Happy Happy Joy Joy\n") diff --git a/scheme/tests/fixnums.ss b/scheme/tests/fixnums.ss new file mode 100644 index 0000000..bf484da --- /dev/null +++ b/scheme/tests/fixnums.ss @@ -0,0 +1,32 @@ + +(library (tests fixnums) + (export test-fxdiv-and-mod) + (import (ikarus)) + + (define (test-fxdiv-and-mod) + (define (test x1 x2) + (let-values ([(d m) (fxdiv-and-mod x1 x2)]) + (printf "(fxdiv-and-mod ~s ~s) = ~s ~s\n" x1 x2 d m) + (assert (= d (fxdiv x1 x2))) + (assert (= m (fxmod x1 x2))) + (assert (<= 0 m)) + (assert (< m (abs x2))) + (assert (= x1 (+ (* d x2) m))))) + + (test +17 +3) + (test +17 -3) + (test -17 +3) + (test -17 -3) + (test +16 +3) + (test +16 -3) + (test -16 +3) + (test -16 -3) + (test +15 +3) + (test +15 -3) + (test -15 +3) + (test -15 -3) + (test +10 +4) + (test +10 -4) + (test -10 +4) + (test -10 -4))) + diff --git a/scheme/todo-r6rs.ss b/scheme/todo-r6rs.ss index 0033e2d..821837c 100755 --- a/scheme/todo-r6rs.ss +++ b/scheme/todo-r6rs.ss @@ -1,4 +1,4 @@ -#!/usr/bin/env ikarus --r6rs-script +#!/usr/bin/env scheme-script ;;; Ikarus Scheme -- A compiler for R6RS Scheme. ;;; Copyright (C) 2006,2007 Abdulaziz Ghuloum ;;; @@ -293,8 +293,8 @@ [fxbit-set? S fx] [fxcopy-bit S fx] [fxcopy-bit-field S fx] - [fxdiv S fx] - [fxdiv-and-mod S fx] + [fxdiv C fx] + [fxdiv-and-mod C fx] [fxdiv0 S fx] [fxdiv0-and-mod0 S fx] [fxeven? C fx] @@ -304,7 +304,7 @@ [fxlength S fx] [fxmax C fx] [fxmin C fx] - [fxmod S fx] + [fxmod C fx] [fxmod0 S fx] [fxnegative? C fx] [fxnot C fx]