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