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