CONS对象可以用作哈希表的键吗?

时间:2015-02-12 09:21:02

标签: lisp common-lisp gnu-common-lisp

我最近一直在玩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

2 个答案:

答案 0 :(得分:5)

(make-hash-table :test #'equal)

答案 1 :(得分:0)

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

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

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