Changeset 22174 in project for release/4/isbn/trunk/isbn.scm


Ignore:
Timestamp:
01/02/11 23:49:25 (10 years ago)
Author:
Christian Kellermann
Message:

isbn: isbn13->isbn10 added

File:
1 edited

Legend:

Unmodified
Added
Removed
  • release/4/isbn/trunk/isbn.scm

    r22163 r22174  
    33    valid-isbn?
    44    isbn10->isbn13
     5    isbn13->isbn10
    56    isbn-type)
    67
    78   (import chicken scheme)
    89   (use srfi-1)
     10
     11   (define (recalculate-isbn10-checkdigit isbn)
     12     (append (drop-right isbn 1)
     13             (list (- 11 (modulo (fold (lambda (x y seed)
     14                                         (+ seed (* x y)))
     15                                       0
     16                                       (iota 10 10 -1)
     17                                       (take isbn 9))
     18                                 11)))))
     19
     20   (define (isbn13->isbn10 isbn-string)
     21     (let ((isbn (string->isbn isbn-string)))
     22       (when (not (equal? '(9 7 8) (take isbn 3)))
     23             (error "Unable to convert this isbn since it is not unambigous with any other prefix than 978"))
     24
     25       (isbn->string
     26        (recalculate-isbn10-checkdigit (take (drop isbn 3) 10)))))
    927
    1028   (define (valid-isbn10-checksum? isbn)
     
    6381       (reverse isbn)))
    6482
     83   (define (isbn->string isbn)
     84     (let* ((isbn-orig (reverse isbn))
     85            (isbn
     86             (cond ((and (= (length isbn-orig) 13)
     87                         (= (car isbn-orig) 10))
     88                    (cons 0 (cdr isbn-orig)))
     89                   ((and (= (length isbn-orig) 10)
     90                         (= (car isbn-orig) 10))
     91                    (cons "X" (cdr isbn-orig)))
     92                   (else isbn-orig))))
     93       (fold string-append ""
     94             (map (lambda (x)
     95                    (if (equal? "X" x) x (number->string x)))
     96                  isbn))))
     97   
    6598   (define (isbn13->string isbn)
    6699     (string-append
     
    96129               (isbn13->string isbn13)))
    97130
    98    (define (normalize-isbn isbn)
    99      (let* ((isbn-orig (reverse (string->isbn isbn)))
    100             (isbn
    101              (cond ((and (= (length isbn-orig) 13)
    102                          (= (car isbn-orig) 10))
    103                     (cons 0 (cdr isbn-orig)))
    104                    ((and (= (length isbn-orig) 10)
    105                          (= (car isbn-orig) 10))
    106                     (cons "X" (cdr isbn-orig)))
    107                    (else (error "Not a valid length for an isbn" isbn)))))
    108        (fold string-append ""
    109              (map (lambda (x)
    110                     (if (equal? "X" x) x (number->string x)))
    111                   isbn)))))
     131
     132   (define (normalize-isbn isbn-string)
     133     (when (not (valid-isbn? isbn-string))
     134           (error "invalid ISBN" isbn-string))
     135     (isbn->string (string->isbn isbn-string))))
Note: See TracChangeset for help on using the changeset viewer.