作者:sucbenson-lee_905 | 来源:互联网 | 2022-12-05 15:04
1> Rainer Joswi..:
设置b的车改变了汽车.
你是不是设置car
的b
.您正在设置car
由b
和引用的相同cons单元格a
.
CL-USER 1 > (let (a b)
(setq a (cons 1 2))
(setq b a)
(eq a b))
T
说明:
我们有变量a
和b
.
(cons 1 2)
返回一个cons小区
(setq a (cons 1 2))
设置一个(cons 1 2)
cons单元格的结果.
(setq b a)
计算a
,返回上面的cons单元格并设置b
为cons单元格.
要理解的关键是变量和函数的评估将非原始(不是原始数字,字符,...)对象作为自身返回 - 而不是作为副本.
我假设a和b持有cons对象而不是指向conses的指针.
那是错的.a
并且b
是变量,它们只指向同一个单一的cons单元格.
"cons构造了包含两个值或指向值的指针的内存对象"
在Common Lisp实现中,类似小数字(fixnums)的东西可能直接存储在cons单元格中.一个不能可靠地通过身份(使用比较数字EQ
),并有做数值比较(EQL
,=
,...).
OTOH,cons细胞不能存储在cons细胞内,因此在内部由指针引用.
您使用的操作:
SETQ:评估第一个form1,结果存储在变量var1中.- >注意它是怎么说的:结果而不是结果的副本.
RPLCA - 这是(setf CAR)
实际使用的.:rplaca用对象替换cons的汽车并且cons被修改 - >因此它修改了作为参数传递的cons对象.
评估 - 自执行代码以来,评估规则适用.
进一步了解Lisp的执行模型:
一本旧的Lisp书:约翰艾伦的"LISP解剖".(亚马逊)
一个方案规范,如R5RS.
Lisp是一小部分,一本书解释了Scheme/Lisp的执行模型及其实现.