~ chicken-r7rs (master) f1da60b5c95f42fc4efb4639e18bd0c754403a39
commit f1da60b5c95f42fc4efb4639e18bd0c754403a39 Author: Peter Bex <peter@more-magic.net> AuthorDate: Tue May 29 20:29:32 2018 +0200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Tue May 29 20:29:32 2018 +0200 Add definitions for missing division procedures diff --git a/scheme.base.scm b/scheme.base.scm index 31d5f23..bc64abd 100644 --- a/scheme.base.scm +++ b/scheme.base.scm @@ -32,9 +32,8 @@ (import r7rs-support) (import chicken.type) (import (only chicken.base exact-integer? exact-integer-sqrt - floor/ floor-quotient floor-remainder truncate/ - truncate-quotient truncate-remainder error - foldl cut optional when case-lambda unless)) + quotient&remainder + error foldl cut optional when case-lambda unless receive)) (export exact-integer? exact-integer-sqrt) (export floor/ floor-quotient floor-remainder) @@ -164,6 +163,48 @@ ;;; 6.2.6 Numerical operations ;;; +;; TODO: Copy the specializations from types.db +(: truncate/ ((or integer float) (or integer float) -> (or integer float) (or integer float))) + +(define truncate/ quotient&remainder) + +(: truncate-remainder ((or integer float) (or integer float) -> (or integer float))) + +(define truncate-remainder remainder) + +(: truncate-quotient ((or integer float) (or integer float) -> (or integer float))) + +(define truncate-quotient quotient) + +;; XXX These are bad bad bad definitions; very inefficient. +;; But to improve it we would need to provide another implementation +;; of the quotient procedure which floors instead of truncates. + +(: floor-remainder ((or fixnum bignum float ratnum) (or fixnum bignum float ratnum) -> (or fixnum bignum float ratnum) (or fixnum bignum float ratnum))) + +(define (floor-remainder x y) + (receive (div rem) (floor/ x y) rem)) + +(: floor-quotient ((or fixnum bignum float ratnum) (or fixnum bignum float ratnum) -> (or fixnum bignum float ratnum) (or fixnum bignum float ratnum))) + +(define (floor-quotient x y) + (receive (div rem) (floor/ x y) div)) + +(: floor/ ((or fixnum bignum float ratnum) (or fixnum bignum float ratnum) -> (or fixnum bignum float ratnum) (or fixnum bignum float ratnum))) + +;; Same as quotient&remainder, but quotient gets adjusted along with +;; the remainder. +(define (floor/ x y) + (receive (div rem) (quotient&remainder x y) + (if (positive? y) + (if (negative? rem) + (values (- div 1) (+ rem y)) + (values div rem)) + (if (positive? rem) + (values (- div 1) (+ rem y)) + (values div rem))))) + + (: square (number -> number)) (define (square n) (* n n))Trap