Changeset 22174 in project for release/4/isbn/trunk/isbn.scm
- Timestamp:
- 01/02/11 23:49:25 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
release/4/isbn/trunk/isbn.scm
r22163 r22174 3 3 valid-isbn? 4 4 isbn10->isbn13 5 isbn13->isbn10 5 6 isbn-type) 6 7 7 8 (import chicken scheme) 8 9 (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))))) 9 27 10 28 (define (valid-isbn10-checksum? isbn) … … 63 81 (reverse isbn))) 64 82 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 65 98 (define (isbn13->string isbn) 66 99 (string-append … … 96 129 (isbn13->string isbn13))) 97 130 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.