1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

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.
This commit is contained in:
Julian Graham 2010-11-17 00:59:45 -05:00
parent eeb48bc27e
commit b98d5a5a76
3 changed files with 104 additions and 11 deletions

View file

@ -52,18 +52,18 @@
boolean? symbol? char? vector? null? pair? number? string? procedure?
define define-syntax syntax-rules lambda let let* let-values
let*-values letrec letrec* begin quote lambda if set! cond case or and not
eqv? equal? eq? + - * / max min abs numerator denominator gcd lcm
floor ceiling truncate round rationalize real-part imag-part
let*-values letrec letrec* begin quote lambda if set! cond case or
and not eqv? equal? eq? + - * / max min abs numerator denominator gcd
lcm floor ceiling truncate round rationalize real-part imag-part
make-rectangular angle div mod div-and-mod div0 mod0 div0-and-mod0
expt exact-integer-sqrt sqrt exp log sin cos tan asin acos atan
make-polar magnitude angle complex? real? rational? integer? exact?
inexact? real-valued? rational-valued? integer-values? zero?
inexact? real-valued? rational-valued? integer-valued? zero?
positive? negative? odd? even? nan? finite? infinite? exact inexact =
< > <= >= number->string string->number 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 list? list length append reverse
< > <= >= 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 list? list length append reverse
list-tail list-ref map for-each symbol->string string->symbol symbol=?
char->integer integer->char char=? char<? char>? char<=? char>=?
make-string string string-length string-ref string=? string<? string>?

View file

@ -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))))

View file

@ -21,6 +21,60 @@
:use-module ((rnrs base) :version (6))
:use-module (test-suite lib))
(with-test-prefix "boolean=?"
(pass-if "boolean=? null" (boolean=?))
(pass-if "boolean=? unary" (boolean=? #f))
(pass-if "boolean=? many"
(and (boolean=? #t #t #t)
(boolean=? #f #f #f)
(not (boolean=? #t #f #t))))
(pass-if "boolean=? mixed type" (not (boolean=? #t #t 'foo))))
(with-test-prefix "symbol=?"
(pass-if "symbol=? null" (symbol=?))
(pass-if "symbol=? unary" (symbol=? 'a))
(pass-if "symbol=? many"
(and (symbol=? 'a 'a 'a)
(symbol=? 'foo 'foo 'foo)
(not (symbol=? 'a 'foo 'a))))
(pass-if "symbol=? mixed type" (not (symbol=? 'a 'a 123))))
(with-test-prefix "infinite?"
(pass-if "infinite? true on infinities"
(and (infinite? +inf.0) (infinite? -inf.0)))
(pass-if "infinite? false on non-infities"
(and (not (infinite? 123)) (not (infinite? +nan.0)))))
(with-test-prefix "finite?"
(pass-if "finite? false on infinities"
(and (not (finite? +inf.0)) (not (finite? -inf.0))))
(pass-if "finite? true on non-infinities"
(and (finite? 123) (finite? 123.0))))
(with-test-prefix "exact-integer-sqrt"
(pass-if "exact-integer-sqrt simple"
(let-values (((s e) (exact-integer-sqrt 5)))
(and (eqv? s 2) (eqv? e 1)))))
(with-test-prefix "integer-valued?"
(pass-if "true on integers"
(and (integer-valued? 3) (integer-valued? 3.0) (integer-valued? 3.0+0.0i)))
(pass-if "false on rationals" (not (integer-valued? 3.1)))
(pass-if "false on reals" (not (integer-valued? +nan.0))))
(with-test-prefix "rational-valued?"
(pass-if "true on integers" (rational-valued? 3))
(pass-if "true on rationals"
(and (rational-valued? 3.1) (rational-valued? 3.1+0.0i)))
(pass-if "false on reals"
(or (not (rational-valued? +nan.0))
(throw 'unresolved))))
(with-test-prefix "real-valued?"
(pass-if "true on integers" (real-valued? 3))
(pass-if "true on rationals" (real-valued? 3.1))
(pass-if "true on reals" (real-valued? +nan.0)))
(with-test-prefix "vector-for-each"
(pass-if "vector-for-each simple"
(let ((sum 0))