scsh-0.5/misc/integertostring.scm

65 lines
1.6 KiB
Scheme

;Date: Mon, 24 Jan 94 15:10:30 -0500
;To: jar@ai.mit.edu
;Subject: integer->string
;From: kelsey@research.nj.nec.com
;Sender: kelsey@research.nj.nec.com
;
;
;I have gotten tired of waiting for bignums to print out.
;Here is a somewhat more complex and faster version of integer->string.
;
;Converting 10**100 to a string:
; Current: 0.44 seconds
; This: 0.12 seconds
; This using integer-divide: 0.06 seconds
;
;There is no overwhelming reason to use this, but here it is.
(define integer->string
(let ()
(define (integer->string n radix)
(define (small-integer->magnitude n l)
(if (= n 0)
l
(small-integer->magnitude (quotient n radix)
(cons (integer->digit (remainder n radix))
l))))
(define (integer->magnitude n)
(let ((rrrr (* (* radix radix) (* radix radix))))
(let recur ((n n) (l '()))
(if (< n rrrr)
(small-integer->magnitude n l)
(do ((i 4 (- i 1))
(n0 (remainder n rrrr) (quotient n0 radix))
(l l (cons (integer->digit (remainder n0 radix)) l)))
((= 0 i)
(recur (quotient n rrrr) l)))))))
(let ((magnitude (cond ((= n 0) '(#\0))
((< n 1000000)
(small-integer->magnitude (abs n) '()))
(else
(integer->magnitude (abs n))))))
(list->string (if (>= n 0)
magnitude
(cons #\- magnitude)))))
(define (integer->digit n)
(ascii->char (+ n (if (< n 10)
zero
a-minus-10))))
(define zero (char->ascii #\0))
(define a-minus-10 (- (char->ascii #\a) 10))
integer->string))