Looking at Andrew's implementation, it struck me as being a not very scheme-like implementation because it used an iterator (do) and mutating variables (set!). This gave me an opportunity to test my new found Scheme skills :-
(define (luhn-check account-number)
  (letrec ( 
      (digit (lambda (str pos) (string->number (string (string-ref str pos)))))    
      (add-digits (lambda (str)
        (+ (digit str 0) (if (> (string-length str) 1)(digit str 1) 0))           
       ))    
      (luhn-pair (lambda (x) 
        (+ (digit account-number x) 
         (if (> x 0) (add-digits (number->string (* (digit account-number (- x 1)) 2))) 0)
         (if (> x 1) (luhn-pair (- x 2)) 0))
      )))    
      (luhn-pair (- (string-length account-number) 1))
    )
  )
It takes a string and returns a number which should be a multiple of 10 for a valid mod 10 check or a multiple of 11 for a valid mod 11 check.
 
 
No comments:
Post a Comment