Comments and some bugs
Jens Axel Søgaard
(23 Mar 2004 16:18 UTC)
|
Re: Comments and some bugs soo (23 Mar 2004 17:09 UTC)
|
Re: Comments and some bugs
Jens Axel Søgaard
(24 Mar 2004 16:51 UTC)
|
* From: Jens Axel Søgaard <xxxxxx@soegaard.net> * Date: Tue, 23 Mar 2004 17:17:32 +0100 * Subj: Comments and some bugs Thank you for your comments. - the name OBJECT->STRING is more "Schemy" (it's pretty long though) Yes, it's too long. - I find the name of the parameter DEPTH in the documentation confusing. (It makes me think in two dimensional output) How about 'precision'? where a negative number is truncated: > (fmt -1.55555 3 2) "-1.54" Yes, it's a bug. I've corrected it. (define (fmt expr . rest) (if (number? expr) (receive (width depth char radix plus exactness space . str-list) (opt-values rest (cons #f (lambda (x) (and (integer? x) (exact? x)))) (cons #f (lambda (x) (and (integer? x) (exact? x) (<= 0 x)))) (cons #f char?) (list 'd 'b 'o 'x) (cons #f (lambda (x) (eq? x +))) (cons #f (lambda (x) (memq x '(e i)))) (cons #f (lambda (x) (and (list? x) (<= 1 (length x) 2) (every (lambda (x) (and (integer? x) (exact? x) (<= 0 x))) x))))) (arg-ors ("fmt: bad argument" str-list (not (every string? str-list))) ("fmt: non-decimal cannot be inexact" radix (and (memq radix '(b o x)) (or depth (and (inexact? expr) (not (eq? exactness 'e))) (eq? exactness 'i)))) ("fmt: exact number cannot have a decimal point" depth (and depth (eq? exactness 'e))) ("fmt: unnecessary padding character" char (and char (not width)))) (let* ((width (or width 0)) (char (or char #\space)) (sign (if (< width 0) '- '+)) (str (number->string (if exactness (if (eq? exactness 'e) (if (inexact? expr) (inexact->exact expr) expr) (if (exact? expr) (exact->inexact expr) expr)) (if (and depth (exact? expr)) (exact->inexact expr) expr)) (cdr (assq radix '((b . 2) (d . 10) (o . 8) (x . 16)))))) (str (if depth (let ((e-index (or (string-index str #\e) (string-index str #\E))) (+-index (string-index str #\+ 1))) (define (mold str dep) (let ((len (string-length str)) (index (string-index str #\.))) (if index (let ((d-len (- len index 1))) (if (<= d-len dep) (string-append str (make-string (- dep d-len) #\0)) (mold (number->string ;; begin correction (let ((num (string->number (substring str 0 (+ (if (= dep 0) 0 1) index dep))))) ((if (< num 0) - +) ;; end correction num (if (< 4 (string->number (string (string-ref str (+ 1 index dep))))) (expt 0.1 dep) 0)))) dep))) (string-append str "." (make-string dep #\0))))) (cond (e-index (string-append (mold (substring str 0 e-index) depth) (substring str e-index (string-length str)))) (+-index (string-append (mold (substring str 0 +-index) depth) "+" (mold (substring str (+ 1 +-index) (- (string-length str) 1)) depth) (string (string-ref str (- (string-length str) 1))))) (else (mold str depth)))) str)) (str (if (and (< 0 (real-part expr)) (not (eqv? #\+ (string-ref str 0))) plus) (string-append "+" str) str)) (len (string-length str)) (lt (if space (car space) 0)) (rt (if (and space (not (null? (cdr space)))) (cadr space) 0)) (pad (- (abs width) len lt rt))) (apply string-append (make-string lt #\space) (cond ((<= pad 0) str) ((eq? sign '+) (if (and (eqv? char #\0) (or (eqv? #\+ (string-ref str 0)) (eqv? #\- (string-ref str 0)))) (string-append (string (string-ref str 0)) (make-string pad char) (substring str 1 len)) (string-append (make-string pad char) str))) (else (string-append str (make-string pad char)))) (make-string rt #\space) str-list))) (receive (width depth char show case space . str-list) (opt-values rest (cons #f (lambda (x) (and (integer? x) (exact? x)))) (cons #f (lambda (x) (and (integer? x) (exact? x) (<= 0 x)))) (cons #f char?) (list display write) (cons #f (lambda (x) (memq x '(d u t)))) (cons #f (lambda (x) (and (list? x) (<= 1 (length x) 2) (every (lambda (x) (and (integer? x) (exact? x) (<= 0 x))) x))))) (arg-ors ("fmt: bad argument" str-list (not (every string? str-list))) ("fmt: unnecessary padding character" char (and char (not width)))) (let* ((width (or width 0)) (char (or char #\space)) (sign (if (< width 0) '- '+)) (str (get-output-string (let ((str-port (open-output-string))) (show expr str-port) str-port))) (str (if (and depth (< depth (string-length str))) (substring str 0 depth) str)) (str (if case ((cdr (assq case `((d . ,string-downcase) (u . ,string-upcase) (t . ,string-titlecase)))) str) str)) (lt (if space (car space) 0)) (rt (if (and space (not (null? (cdr space)))) (cadr space) 0)) (pad (- (abs width) (string-length str) lt rt))) (apply string-append (make-string lt #\space) (cond ((<= pad 0) str) ((eq? sign '+) (string-append (make-string pad char) str)) (else (string-append str (make-string pad char)))) (make-string rt #\space) str-list))))) |.... |.... |.... Please check the revised version in `a preface'. Thanks. -- INITERM