在公共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*)