### (new car% [brand "toyota"] [type "corolla"])

The big thing that's happened this weekend was getting a car; I bought a 2007 Toyota Corolla. I still have some mixed feelings about this, but I think I'll need it to survive the winters here.

These machines cost a lot! I dropped by http://www.edmunds.com/apps/calc/CalculatorController. But it's a black box to me: I had no real idea how it was actually doing its calculation. So I tried to cook up the calculations from scratch:

Now I could verify for myself: how long would it be until I dig myself out of a big hole?

Oh. Ok, so at least it looks like the code is doing the same thing as the Edmunds calculator. That's good.

I should brush up on my recurrence relations, though, since I'm sure that there's a closed form for this calculation.

These machines cost a lot! I dropped by http://www.edmunds.com/apps/calc/CalculatorController. But it's a black box to me: I had no real idea how it was actually doing its calculation. So I tried to cook up the calculations from scratch:

(module car-payment mzscheme

;; Small toy code for calculating car stuff.

(provide (all-defined))

;; debt: number number number number -> number

;; Returns the amount of money owed after months pass,

;; given a particular monthly payment and apr rate.

(define (debt months current-debt monthly-payment apr)

(let loop ([n months]

[current-debt current-debt])

(cond

[(= n 0) current-debt]

[else

(let ([monthly-interest (/ apr 12)])

(loop (sub1 n)

(* (+ 1 monthly-interest)

(- current-debt monthly-payment))))])))

;; months-till-debt-free: number number number -> number

;; Returns how many months have to pass before we're debt free.

(define (months-till-debt-free initial-cost monthly-payment apr)

(let loop ([n 0])

(let ([new-debt (debt n initial-cost monthly-payment apr)])

(cond

[(<= new-debt 0) n]

[else (loop (add1 n))])))))

Now I could verify for myself: how long would it be until I dig myself out of a big hole?

> (months-till-debt-free 16300 327.93 0.0767)

60

Oh. Ok, so at least it looks like the code is doing the same thing as the Edmunds calculator. That's good.

I should brush up on my recurrence relations, though, since I'm sure that there's a closed form for this calculation.