~ 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