Testing the reference implementation
Bradley Lucier 23 Oct 2005 03:59 UTC
I'd like to run some tests with the reference implementation, which
is written for Scheme 48, and unfortunately I don't have any
experience with this system.
I've looked in the Scheme 48 docs and the web page for SRFI-34 and
tried to get the following program to work. Unfortunately, in the
"will" implementation it gives me only the following:
r6rs/will> (load "complex-test.scm")
complex-test.scm
Error: I'm bored.
#{Inf}
(&error)
Might someone help me with modifying this code so it will work?
Brad
;;; This program was written for Gambit-C. If you can find or write
"with-exception-handler"
;;; for your scheme, it may work there, too.
;;; It was modified to work with the SRFI-77 reference implementation
on Scheme 48, but I haven't
;;; had much luck getting it to run yet.
;;; This program tests +, -, *, and / with all combinations of
"arguments" as the real part
;;; and the imaginary parts of the two arguments of the operators.
It writes ths results
;;; to a file name "results" in a way that should be independent of
how NaNs and infinities
;;; are represented on your scheme system.
;;; If you think the results should be significantly different for
any of these operations,
;;; I'd like to hear about it: lucier at math dot purdue dot edu
(define plus-infinity (let loop ((x (r5rs->number 2.0)))
(let ((two-x (* (r5rs->number 2.0) x)))
(if (= x two-x)
x
(loop two-x)))))
(define minus-infinity (- plus-infinity))
(define plus-zero (/ (r5rs->number 1.0) plus-infinity))
(define minus-zero (/ (r5rs->number 1.0) minus-infinity))
(define not-a-number (/ plus-zero plus-zero))
(define arguments (list (r5rs->number 0)
(r5rs->number 1)
(r5rs->number -1)
plus-zero
minus-zero
(r5rs->number 1.)
(r5rs->number -1.)
plus-infinity
minus-infinity
not-a-number))
(define operations+names (list (list + '+)
(list - '-)
(list * '*)
(list / '/)))
(define error-object (list "ERROR"))
(define (print-result name first-arg second-arg result)
(define (print-arg arg)
(define (print-number x)
(cond ((exact? x)
(if (>= x (r5rs->number 0))
(display "+"))
(display x))
((not (= x x)) (display "+NAN."))
((zero? x)
(if (> (/ (r5rs->number 1.0) x) (r5rs->number 0.))
(display "+0.")
(display "-0.")))
((= (+ x x) x)
(if (> x (r5rs->number 0.))
(display "+INF.")
(display "-INF.")))
(else
(if (>= x (r5rs->number 0.))
(display "+"))
(display x))))
(if (eq? arg error-object)
(display "ERROR")
(begin
(print-number (real-part arg))
(print-number (imag-part arg))
(display "i"))))
(display "(")
(display name)
(display " ")
(print-arg first-arg)
(display " ")
(print-arg second-arg)
(display ") => ")
(print-arg result)
(newline))
(with-output-to-file "results"
(lambda ()
(for-each (lambda (arg1)
(for-each (lambda (arg2)
(for-each (lambda (arg3)
(for-each (lambda (arg4)
(for-each (lambda (operation+name)
(let ((operation (car operation+name))
(name (cadr operation+name))
(first-arg (make-rectangular
arg1 arg2))
(second-arg (make-rectangular
arg3 arg4)))
(let ((result (with-exception-handler
(lambda (args) error-object)
(lambda ()
(operation first-arg
second-arg)))))
(print-result name first-arg
second-arg result))))
operations+names))
arguments))
arguments))
arguments))
arguments)))