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