(defun memoize (fn-name) (setf (symbol-function fn-name) (memo (symbol-function fn-name)))) (defmacro defun* (fn args &rest body) `(memoize (defun ,fn ,args ,@body)))または,
(defmacro defun* (fn args &rest body) `(let ((fn-name (defun ,fn ,args ,@body))) (setf (symbol-function fn-name) (memo (symbol-function fn-name)))))というような関数定義マクロdefun*を用いることで,記憶型の関数を定義でき るようになります.
(defun* fib* (n) (if (< n 2) 1 (+ (fib* (1- n)) (fib* (- n 2))))) > > (time (fib* 19)) cpu time (non-gc) 100 msec user, 17 msec system cpu time (gc) 0 msec user, 0 msec system cpu time (total) 100 msec user, 17 msec system real time 127 msec 6765 ;;; clispの場合 [34]> (time (fib* 19)) Real time: 0.0 sec. Run time: 0.0 sec. Space: 320 Bytes 6765ここまでの例では,fibのように引数がひとつの関数の ものでした.そこで,複数の引数をもつものでも対応が とれるようにします.