在公共Lisp和Let中修改哈希表

在公共Lisp和Let中修改哈希表,lisp,hashtable,common-lisp,evaluation,Lisp,Hashtable,Common Lisp,Evaluation,我一直在尝试用以下代码修改哈希表 (let ((alist '(gethash key *hash-table*))) (setf alist (cons 'key 'weight))) 但问题是它实际上并没有修改哈希表(还要注意 (let ((alist (gethash key *hash-table*))) (setf alist (cons 'key 'weight))) 也不起作用,而下面的代码起作用 (setf (gethash key *hash-table*) (co

我一直在尝试用以下代码修改哈希表

(let ((alist '(gethash key *hash-table*)))
  (setf alist (cons 'key 'weight)))
但问题是它实际上并没有修改哈希表(还要注意

(let ((alist (gethash key *hash-table*)))
  (setf alist (cons 'key 'weight)))
也不起作用,而下面的代码起作用

(setf (gethash key *hash-table*) (cons 'key 'weight)))
我不明白为什么这个能用,而另一个不能用。这很有用(在这个代码段之外),因为(我假设)这就是为什么我不能运行这样的函数

(alist-initialize (gethash key *hash-table*))
定义为:

(defun alist-initialize (alist)
  (setf alist (cons 'a 'b))

设置变量会修改其局部绑定。 你不会想到的

(let ((a 5))
  (setf a 2))
以某种方式将
5
的值更改为
2
。 同样地

(let ((alist (gethash key *hash-table*))) 
  (setf alist (cons 'key 'weight)))
(gethash key*哈希表*)
没有影响。 发生的情况是,
*哈希表*
中查找,
列表
被绑定到返回的值。然后修改
列表
的绑定,完全不理会以前的绑定

(请注意,您的第一个表单引用了
[gethash][2]
调用,因此根本不访问哈希表)

您的函数应定义如下:

(defun alist-initialize (key alist)
  (setf (gethash key *hash-table*) alist))
并用两个参数调用,而不是一个参数


“为了充分披露的利益”,CL确实为您提供了便利(参见和),但这是相对先进的材料,您现在应该忽略它。

为什么要混合assoc列表和哈希表?两者都可以用于类似的目的,但它们彼此独立

如果要将某些内容放入哈希表中,则必须编写:

(setf (gethash key *hash-table*) value)
如果要获取该值,请执行以下操作:

(gethash key *hash-table*)