首页 > 解决方案 > 为什么 setq 什么都不做?

问题描述

我需要使用 setq 更新嵌套在另一个关联列表中的关联列表中的值。我还不知道该怎么做,但是我找出如何做的第一步是行不通的。

在这里尽可能简单地说是我尝试过的:

(defvar l (list 1 2 3))
(loop for x in l do (setq x 5))

我希望这会将 l 中的所有元素更新为 5,但是当我检查 l 的值时,它根本不会改变。如果它不适用于此示例,那么显然它不适用于我的嵌套 alists 场景。我如何循环 l 并更改元素?此外,如果 l 没有更新,那么 (setq x ...) 甚至在做什么?

编辑我决定使用常规的关联列表继续前进,但我仍然卡住了

(defvar u (list (list 1 2) (list 3 4)))
(assoc 1 u)
=> (1 2)
(let ((a (assoc 1 u))) (setf (assoc u 1) (cons (car a) 5)))

我希望你更改为 ((1 5) (3 4)) 但我收到错误函数 (SETF ASSOC) 未定义。如果 assoc 没有内置的 setf 形式,那么肯定还有其他内置功能可以做到这一点吗?

标签: common-lisp

解决方案


(loop for x in l do (setq x 5))

l是一个外部变量。

x是一个局部变量。该循环创建局部变量并将列表项绑定到每个循环轮次中的变量。

如果您设置变量x,那么您只需更改该变量绑定。它对列表没有影响,因为x它有自己对元素的引用。它不引用列表存储单元。


推荐阅读