summaryrefslogtreecommitdiff
path: root/module/rnrs
diff options
context:
space:
mode:
authorJulian Graham <julian.graham@aya.yale.edu>2010-11-17 00:59:45 -0500
committerJulian Graham <julian.graham@aya.yale.edu>2010-11-17 00:59:45 -0500
commitb98d5a5a7607b905afa54fd2768210232fa08e16 (patch)
tree322fd61c2d644a7181f9738617dbe90fea04dc74 /module/rnrs
parenteeb48bc27e27976acec41dc0e59e7aaab2b886cd (diff)
downloadguile-b98d5a5a7607b905afa54fd2768210232fa08e16.tar.gz
Add exports for missing functions from `(rnrs base)'.
* module/rnrs.scm (boolean=?): New export. Fix typo in export of`integer-valued?'. * module/rnrs/base.scm: Add exports for `exact' and `inexact'. (boolean=?, symbol=?, infinite?, finite?, exact-integer-sqrt, integer-valued?, rational-valued?, real-valued?): New functions. * test-suite/tests/r6rs-base.test (boolean=?, symbol=?, infinite?, finite?, exact-integer-sqrt, integer-valued?, rational-valued?, real-valued?): New test prefixes and tests.
Diffstat (limited to 'module/rnrs')
-rw-r--r--module/rnrs/base.scm45
1 files changed, 42 insertions, 3 deletions
diff --git a/module/rnrs/base.scm b/module/rnrs/base.scm
index 74fce31dc..63204208e 100644
--- a/module/rnrs/base.scm
+++ b/module/rnrs/base.scm
@@ -37,13 +37,15 @@
make-polar magnitude angle
complex? real? rational? integer? exact? inexact? real-valued?
- rational-valued? integer-values? zero? positive? negative? odd? even?
+ rational-valued? integer-valued? zero? positive? negative? odd? even?
nan? finite? infinite?
exact inexact = < > <= >=
number->string string->number
+ boolean=?
+
cons car cdr caar cadr cdar cddr caaar caadr cadar cdaar caddr cdadr
cddar cdddr caaaar caaadr caadar cadaar cdaaar cddaar cdadar cdaadr
cadadr caaddr caddar cadddr cdaddr cddadr cdddar cddddr
@@ -71,8 +73,45 @@
let-syntax letrec-syntax
syntax-rules identifier-syntax)
- (import (rename (guile) (quotient div) (modulo mod))
- (srfi srfi-11))
+ (import (rename (guile)
+ (quotient div)
+ (modulo mod)
+ (exact->inexact inexact)
+ (inexact->exact exact))
+ (srfi srfi-11))
+
+ (define (boolean=? . bools)
+ (define (boolean=?-internal lst last)
+ (or (null? lst)
+ (let ((bool (car lst)))
+ (and (eqv? bool last) (boolean=?-internal (cdr lst) bool)))))
+ (or (null? bools)
+ (let ((bool (car bools)))
+ (and (boolean? bool) (boolean=?-internal (cdr bools) bool)))))
+
+ (define (symbol=? . syms)
+ (define (symbol=?-internal lst last)
+ (or (null? lst)
+ (let ((sym (car lst)))
+ (and (eq? sym last) (symbol=?-internal (cdr lst) sym)))))
+ (or (null? syms)
+ (let ((sym (car syms)))
+ (and (symbol? sym) (symbol=?-internal (cdr syms) sym)))))
+
+ (define (infinite? x) (or (eqv? x +inf.0) (eqv? x -inf.0)))
+ (define (finite? x) (not (infinite? x)))
+
+ (define (exact-integer-sqrt x)
+ (let* ((s (exact (floor (sqrt x)))) (e (- x (* s s)))) (values s e)))
+
+ ;; These definitions should be revisited, since the behavior of Guile's
+ ;; implementations of `integer?', `rational?', and `real?' (exported from this
+ ;; library) is not entirely consistent with R6RS's requirements for those
+ ;; functions.
+
+ (define integer-valued? integer?)
+ (define rational-valued? rational?)
+ (define real-valued? real?)
(define (vector-for-each proc . vecs)
(apply for-each (cons proc (map vector->list vecs))))