(defn calc-coins [amount denom]
  {:mod (mod amount denom),
   :dividend (int (/ amount denom))})

(defn clos [amount]
  ; denoms is a list containing the currency denominations
  (let [denoms '(20 10 5 1 0.25 0.10 0.05 0.01)]
    (reductions
     ; declaring a function that 
     (fn [[amount-left coins] denom]
       ; let x equal the result of (calc-coins amount-left denom), which will be
       ; of type `map`
       (let [x (calc-coins amount-left denom),
             ; assign `mod` the value of the keyword `mod` in the mapping
             ; assigned to `x`
             mod (:mod x),
             ; assign `dividend` the value of the keyword `dividend` in the 
             ; mapping assigned to `x`
             dividend (:dividend x)]
         ; if `dividend` is positive (i.e. neither negative nor 0):
         (if (pos? dividend)
           ; return a vector containing the remainder and a map of a 
           ; denomination to the number of times you could divide it into 
           ; amount-left. This return value will be consumed by reduce.
           [mod (assoc coins denom dividend)]
           ; otherwise, return the original input value, which would be
           ; `[amount {}]`. This should (???) only happen the first pass.
           [amount-left coins])))
     [amount {}]
     denoms)))

Generated by matt using scpaste at Sun Jul 10 08:59:31 2011. HADT. (original)