(defmacro defun-mem (name params &body body)
(let ((*name-vals* (gensym))
(value (gensym))
(exist (gensym)))
`(progn
(defvar ,*name-vals* (make-hash-table))
(defun ,name ,params
(multiple-value-bind
(,value ,exist)
(gethash (list ,@params) ,*name-vals*)
(if ,exist
,value
(setf
(gethash (list ,@params) ,*name-vals*)
(progn ,@body))))))))
(format t "~a~%" (macroexpand-1
'(defun-mem ack-mem (m n)
(if (= m 0)
(+ n 1)
(if (= n 0)
(ack-mem (- m 1) 1)
(ack-mem (- m 1) (ack-mem m (- n 1))))))))