From cf1f333731b125ad80a231ad8056ccbd224222ab Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Tue, 12 Mar 2019 00:37:00 +0800 Subject: [PATCH] fixing edge cases --- lib/chibi/show-test.sld | 8 ++++++++ lib/chibi/show/write.scm | 14 +++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/chibi/show-test.sld b/lib/chibi/show-test.sld index 39d3ceff..dff1efaa 100644 --- a/lib/chibi/show-test.sld +++ b/lib/chibi/show-test.sld @@ -92,6 +92,13 @@ (test "-3141.59" (show #f (with ((decimal-align 5)) (numeric -3141.59)))) (test "-31415.9" (show #f (with ((decimal-align 5)) (numeric -31415.9)))) + (test "+inf.0" (show #f +inf.0)) + (test "-inf.0" (show #f -inf.0)) + (test "+nan.0" (show #f +nan.0)) + (test "+inf.0" (show #f (numeric +inf.0))) + (test "-inf.0" (show #f (numeric -inf.0))) + (test "+nan.0" (show #f (numeric +nan.0))) + (cond ((exact? (/ 1 3)) ;; exact rationals (test "333.333333333333333333333333333333" @@ -279,6 +286,7 @@ (test "1.23" (show #f (numeric/fitted 4 1.2345 10 2))) (test "1.00" (show #f (numeric/fitted 4 1 10 2))) (test "#.##" (show #f (numeric/fitted 4 12.345 10 2))) + (test "#" (show #f (numeric/fitted 1 12.345 10 0))) ;; padding/trimming diff --git a/lib/chibi/show/write.scm b/lib/chibi/show/write.scm index 88d94814..3b0969a5 100644 --- a/lib/chibi/show/write.scm +++ b/lib/chibi/show/write.scm @@ -321,8 +321,10 @@ (wrap-comma n)))) ;; Format a single real number with padding as necessary. (define (format n sign-rule) - (let ((s (wrap-sign n sign-rule))) - (let* ((dec-pos (if decimal-align + (cond + ((finite? n) + (let* ((s (wrap-sign n sign-rule)) + (dec-pos (if decimal-align (string-cursor->index s (if (char? dec-sep) @@ -333,7 +335,9 @@ (diff (- (or decimal-align 0) dec-pos 1))) (if (positive? diff) (string-append (make-string diff #\space) s) - s)))) + s))) + (else + (number->string n)))) ;; Write any number. (define (write-complex n) (cond @@ -369,7 +373,7 @@ (if (= base 1024) names2 names10))) (k (min (exact ((if (negative? log-n) ceiling floor) (/ (abs log-n) (log base)))) - (vector-length names))) + (- (vector-length names) 1))) (n2 (round-to (/ n (expt base (if (negative? log-n) (- k) k))) 10))) (each (if (integer? n2) @@ -391,7 +395,7 @@ (let ((prec (if (and (pair? args) (pair? (cdr args))) (cadr args) precision))) - (if prec + (if (and prec (not (zero? prec))) (let* ((dec-sep (or decimal-sep (if (eqv? #\. comma-sep) #\, #\.)))