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