1; SketchyLISP Library
2; Copyright (C) 2005,2006,2007 Nils M Holm. All rights reserved.
3; See the file LICENSE of the SketchyLISP distribution
4; for conditions of use.
5
6; ---name---
7; normalize
8
9; ---conformance---
10; SketchyLISP Core
11
12; ---purpose---
13; Normalize a number by removing leading zeroes and plus signs.
14
15; ---args---
16; X - number
17
18; ---keywords---
19; NORMALIZE function, normalize, normal form, canonical number
20; GCD, reducing, numbers, digits
21
22; ---see-also---
23; digits, ndivide
24
25; ---example---
26; (normalize +000511) => 511
27
28(define normalize #t)
29
30; (require "nullp.scm") ; null?
31(require "digits.scm") ; 0d
32(require "caar.scm") ; cdar
33(require "caaar.scm") ; caadr cdadr
34(require "gcd.scm")
35(require "equal.scm") ; =
36(require "equalp.scm") ; equal?
37(require "quotient.scm")
38(require "minus.scm") ; -
39
40; ---code---
41(define (normalize x)
42  (letrec
43    ; remove leading zeroes from natural number
44    ((skip0
45       (lambda (x)
46         (cond ((null? (cdr x)) x)
47           ((eq? (car x) 0d)
48             (skip0 (cdr x)))
49           (else x))))
50     (norm
51       (lambda (x)
52         (cond ((eq? (car x) '+)
53             (skip0 (cdr x)))
54           ((eq? (car x) '-)
55             (let ((d (skip0 (cdr x))))
56               (cond ((equal? d '(0d)) d)
57                 (else (cons '- d)))))
58           (else (skip0 x))))))
59    (list->integer
60      (norm (integer->list x)) #t)))
61