3

我最近一直在玩 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。如果我用 a 替换(list 1 2)cons仍然不起作用,但是当我使用普通整数时,它工作正常。

我正在使用 GCL 2.6.12

4

2 回答 2

5
(make-hash-table :test #'equal)
于 2015-02-12T10:02:14.257 回答
0

Common Lisp 已经实现了缓存函数结果的解决方案。一个是库票价记忆,第二个是函数缓存,两者都可以通过 Quicklisp 访问。使用前者就像定义普通函数一样简单:

(define-memo-function your-time-consuming-function (arg)
    (code arg))

如需参考,请查看https://github.com/fare/fare-memoization

于 2015-02-12T16:17:20.233 回答