(defmacro defmemofun (name (. args) . body) (let ((hash (gensym "hash-")) (argl (gensym "args-")) (hent (gensym "hent-")) (uniq (copy-str "uniq"))) ^(let ((,hash (hash :equal-based))) (defun ,name (,*args) (let* ((,argl (list ,*args)) (,hent (inhash ,hash ,argl ,uniq))) (if (eq (cdr ,hent) ,uniq) (set (cdr ,hent) (block ,name (progn ,*body))) (cdr ,hent))))))) (defmemofun ack (m n) (cond ((= m 0) (+ n 1)) ((= n 0) (ack (- m 1) 1)) (t (ack (- m 1) (ack m (- n 1)))))) (each ((i (range 0 3))) (each ((j (range 0 4))) (format t "ack(~a, ~a) = ~a\n" i j (ack i j))))