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

Rob*_*nie 3 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*))
Run Code Online (Sandbox Code Playgroud)

它给了我NIL,当我期待123.如果我更换(list 1 2)cons它仍然无法正常工作,但是当我使用一个普通的整数,它工作正常.

我正在使用GCL 2.6.12

Pat*_*ick 5

(make-hash-table :test #'equal)
Run Code Online (Sandbox Code Playgroud)

  • http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm"test ---其中一个函数eq,eql,equal或equalp的指示符.默认为eql." (3认同)
  • 请记住,eql通常是许多函数中的默认值. (3认同)
  • 哦该死的。我发誓,我打开了那个确切的页面,但我跳过了它提供默认值的部分。我想这就是我得到的不是 RTFM 的结果。*羞愧地走开* (2认同)