;; Memoization. (1.01)
;; @note Using dynamically bound variable (Parameters).
(use-modules (srfi srfi-19)
(ice-9 format))
;; Time.
(define (process-time)
(let ((now (current-time time-process)))
(+ (time-second now) (/ (time-nanosecond now) 1E9))))
(define (timeit thunk)
(let ((t (process-time)))
(thunk)
(format #t "Elapsed: ~,6Fs~%" (- (process-time) t))))
;; Memo
(define (memo-list f)
(let ((m '()))
(lambda (k)
(unless (assoc-ref m k)
(set! m (acons k (f k) m)))
(assoc-ref m k))))
(define (memo-hash f)
(let ((m (make-hash-table)))
(lambda (k)
(unless (hash-ref m k)
(hash-set! m k (f k)))
(hash-ref m k))))
;; Show.
(define fib
(make-parameter
(lambda (n)
(cond
((= n 0) 0)
((= n 1) 1)
(else
(+ ((fib) (- n 2)) ((fib) (- n 1))))))))
(define (make-f f)
(lambda ()
(parameterize ((fib f))
(format #t "~A~%" ((fib) 30)))))
(timeit (make-f (memo-list (fib))))
(timeit (make-f (memo-hash (fib))))
(timeit (make-f (fib)))
OzsgTWVtb2l6YXRpb24uICgxLjAxKQo7OyBAbm90ZSBVc2luZyBkeW5hbWljYWxseSBib3VuZCB2YXJpYWJsZSAoUGFyYW1ldGVycykuCgoodXNlLW1vZHVsZXMgKHNyZmkgc3JmaS0xOSkKICAgICAgICAgICAgIChpY2UtOSBmb3JtYXQpKQoKOzsgVGltZS4KCihkZWZpbmUgKHByb2Nlc3MtdGltZSkKICAobGV0ICgobm93IChjdXJyZW50LXRpbWUgdGltZS1wcm9jZXNzKSkpCiAgICAoKyAodGltZS1zZWNvbmQgbm93KSAoLyAodGltZS1uYW5vc2Vjb25kIG5vdykgMUU5KSkpKQoKKGRlZmluZSAodGltZWl0IHRodW5rKQogIChsZXQgKCh0IChwcm9jZXNzLXRpbWUpKSkKICAgICh0aHVuaykKICAgIChmb3JtYXQgI3QgIkVsYXBzZWQ6IH4sNkZzfiUiICgtIChwcm9jZXNzLXRpbWUpIHQpKSkpCgo7OyBNZW1vCgooZGVmaW5lIChtZW1vLWxpc3QgZikKICAobGV0ICgobSAnKCkpKQogICAgKGxhbWJkYSAoaykKICAgICAgKHVubGVzcyAoYXNzb2MtcmVmIG0gaykKICAgICAgICAgICAgICAoc2V0ISBtIChhY29ucyBrIChmIGspIG0pKSkKICAgICAgKGFzc29jLXJlZiBtIGspKSkpCgooZGVmaW5lIChtZW1vLWhhc2ggZikKICAobGV0ICgobSAobWFrZS1oYXNoLXRhYmxlKSkpCiAgICAobGFtYmRhIChrKQogICAgICAodW5sZXNzIChoYXNoLXJlZiBtIGspCiAgICAgICAgICAgICAgKGhhc2gtc2V0ISBtIGsgKGYgaykpKQogICAgICAoaGFzaC1yZWYgbSBrKSkpKQoKOzsgU2hvdy4KCihkZWZpbmUgZmliCiAgKG1ha2UtcGFyYW1ldGVyCiAgIChsYW1iZGEgKG4pCiAgICAoY29uZAogICAgICgoPSBuIDApIDApCiAgICAgKCg9IG4gMSkgMSkKICAgICAoZWxzZQogICAgICAoKyAoKGZpYikgKC0gbiAyKSkgKChmaWIpICgtIG4gMSkpKSkpKSkpCgooZGVmaW5lIChtYWtlLWYgZikKICAobGFtYmRhICgpCiAgICAocGFyYW1ldGVyaXplICgoZmliIGYpKQogICAgICAoZm9ybWF0ICN0ICJ+QX4lIiAoKGZpYikgMzApKSkpKQoKKHRpbWVpdCAobWFrZS1mIChtZW1vLWxpc3QgKGZpYikpKSkKKHRpbWVpdCAobWFrZS1mIChtZW1vLWhhc2ggKGZpYikpKSkKKHRpbWVpdCAobWFrZS1mIChmaWIpKSk=