CONS 对象可以用作散列 table 的键吗?

Can CONS objects be used as a key to a hash table?

我最近一直在玩 LISP,我想尝试通过缓存它的输出来优化一个非常低效的递归函数,这样它只运行每个参数组合一次。我想将结果保存到散列 table 中,使用 (LIST a b)(CONS a b) 作为键。我的问题是,这可能吗?我读过的文档会让我相信它是,因为我读过的文档将 key 定义为 'object',并将 'object' 定义为用 [=15= 构造的东西].所以我试了一下。

(defparameter *table* (make-hash-table))
(setf (gethash (list 1 2) *table*) 123)
(format t "~S~%" (gethash (list 1 2) *table*))

当我期望 123 时,它给了我 NIL。如果我用 cons 替换 (list 1 2) 它仍然不起作用,但是当我使用普通整数时,它工作正常。

我正在使用 GCL 2.6.12

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

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

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

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