;; Exercise 5.11 (define make-verifier (lambda (f m) (lambda (n) (define helper (lambda (n addend i) (if (= n 0) addend (helper (quotient n 10) (+ addend (f i (remainder n 10))) (+ i 1))))) (= 0 (modulo (helper n 0 1) m))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Exercise 5.12 (define check-upc (lambda (n) ((make-verifier (lambda (i di) (if (odd? i) di (* 3 di))) 10) n))) ;; or equivalently (define check-upc (make-verifier (lambda (i di) (if (odd? i) di (* 3 di))) 10)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Exercise 5.13 (define check-cc (lambda (n) ((make-verifier (lambda (i di) (cond ((odd? i) di) ((< di 5) (+ di di)) (else (+ di di 1)))) 10) n))) ;; or equivalently (define check-cc (make-verifier (lambda (i di) (cond ((odd? i) di) ((< di 5) (+ di di)) (else (+ di di 1)))) 10)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Exercise 5.14 (define check-p (lambda (n) ((make-verifier (lambda (i di) (if (= i 1) (- di) di)) 9) n))) ;; or equivalently (define check-p (make-verifier (lambda (i di) (if (= i 1) (- di) di)) 9))