common-lisp - 为什么 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 形式,那么肯定还有其他内置功能可以做到这一点吗?
解决方案
(loop for x in l do (setq x 5))
l
是一个外部变量。
x
是一个局部变量。该循环创建局部变量并将列表项绑定到每个循环轮次中的变量。
如果您设置变量x
,那么您只需更改该变量绑定。它对列表没有影响,因为x
它有自己对元素的引用。它不引用列表存储单元。
推荐阅读
- emotion - 何时使用样式化组件与何时在情感中使用 css 道具?
- php - 如何获取我刚刚添加的 id?
- python - 如果列的len == 1,如何在周列数据框熊猫的前面添加0
- python - 在 django 中生成令牌
- reporting-services - 是否可以在 SSRS 矩阵报告中按参数分组,并根据选择的分组重新排列列?
- java - 使用 Kafka 的 Spark 结构化流式传输
- python - 如何在opencv houghlines方法中增加要在图像中搜索的线的大小?
- informatica - 完全下推优化是否允许数据库服务器在没有 Informatica Server 干预的情况下将数据加载到目标表?
- python - 从python中的字符串中提取数字
- kotlin - 将数字分组到不同的范围