我最近一直在玩LISP,我想通过缓存它的输出来尝试优化一个非常低效的递归函数,所以它只运行一次参数的每个组合。我想将结果保存到哈希表中,使用(LIST a b)
或(CONS a b)
作为键。我的问题是,甚至可能吗?我阅读的文档会让我相信它,因为我阅读的文档将key
定义为'对象'并定义了'对象'作为用cons
构造的东西。所以我试了一下。
(defparameter *table* (make-hash-table))
(setf (gethash (list 1 2) *table*) 123)
(format t "~S~%" (gethash (list 1 2) *table*))
当我期待NIL
时,它会给我123
。如果我用(list 1 2)
替换cons
它仍然无法正常工作,但是当我使用普通整数时,它可以正常工作。
我使用的是GCL 2.6.12
答案 0 :(得分:5)
(make-hash-table :test #'equal)
答案 1 :(得分:0)
已经为Common Lisp实现了缓存函数结果的解决方案。一个是库票据记忆,第二个是功能缓存,两者都可以通过Quicklisp访问。使用前者就像定义正常函数一样简单:
(define-memo-function your-time-consuming-function (arg)
(code arg))