; just showing off
(define (fib n)
(if (< n 2) 1
(+ (fib (- n 1)) (fib (- n 2)))))
(display (fib 30)) (newline)
(define-syntax define-memoized
(syntax-rules ()
((define-memoized (f arg ...) body ...)
(define f
(let ((cache (list)))
(lambda (arg ...)
(cond ((assoc `(,arg ...) cache) => cdr)
(else (let ((val (begin body ...)))
(set! cache (cons (cons `(,arg ...) val) cache))
val)))))))))
(define-memoized (fib n)
(if (< n 2) 1
(+ (fib (- n 1)) (fib (- n 2)))))
(display (fib 30)) (newline)
OyBqdXN0IHNob3dpbmcgb2ZmCgooZGVmaW5lIChmaWIgbikKICAoaWYgKDwgbiAyKSAxCiAgICAoKyAoZmliICgtIG4gMSkpIChmaWIgKC0gbiAyKSkpKSkKCihkaXNwbGF5IChmaWIgMzApKSAobmV3bGluZSkKCihkZWZpbmUtc3ludGF4IGRlZmluZS1tZW1vaXplZAogIChzeW50YXgtcnVsZXMgKCkKICAgICgoZGVmaW5lLW1lbW9pemVkIChmIGFyZyAuLi4pIGJvZHkgLi4uKQogICAgICAoZGVmaW5lIGYKICAgICAgICAobGV0ICgoY2FjaGUgKGxpc3QpKSkKICAgICAgICAgIChsYW1iZGEgKGFyZyAuLi4pCiAgICAgICAgICAgIChjb25kICgoYXNzb2MgYCgsYXJnIC4uLikgY2FjaGUpID0+IGNkcikKICAgICAgICAgICAgKGVsc2UgKGxldCAoKHZhbCAoYmVnaW4gYm9keSAuLi4pKSkKICAgICAgICAgICAgICAgICAgICAoc2V0ISBjYWNoZSAoY29ucyAoY29ucyBgKCxhcmcgLi4uKSB2YWwpIGNhY2hlKSkKICAgICAgICAgICAgICAgICAgICB2YWwpKSkpKSkpKSkKCihkZWZpbmUtbWVtb2l6ZWQgKGZpYiBuKQogIChpZiAoPCBuIDIpIDEKICAgICgrIChmaWIgKC0gbiAxKSkgKGZpYiAoLSBuIDIpKSkpKQoKKGRpc3BsYXkgKGZpYiAzMCkpIChuZXdsaW5lKQ==