我在使用nconc了解一些实验的结果时遇到了一些问题。
(setf x '(a b c))
(setf y '(1 2 3))
(nconc x y) ; => x = (A B C 1 2 3), y = (1 2 3)
根据我的阅读,nconc将x的rest字段更改为y。
(setf (nth 1 y) 10) ; => x = (A B C 1 10 3), y = (1 10 3)
到目前为止,这么好。
(setf y '(4 5 6)) ; => x = (A B C 1 10 3) y = (4 5 6)
为什么x仍然引用旧的cons单元格,换句话说,y的重新分配不只是改变y地址的数据?
提前致谢 迈克尔
答案 0 :(得分:4)
Lisp变量不指向固定内存。他们指向Lisp数据对象。设置变量不会更改任何对象内存。该变量仅指向其他一些数据。
答案 1 :(得分:2)
因为cons
中的最后一个x
设置为指向cons
所指向的y
。它没有动态地或通过引用指向y
的值。
(setf x '(a b c))
; x = (a b c)
(setf y '(1 2 3))
; x = (a b c)
; y = (1 2 3)
(nconc x y)
; x = (a b c 1 2 3)
; y = (1 2 3) = (nthcdr 3 x)
(setf (nth 1 y) 10)
; x = (a b c 1 10 3)
; y = (1 10 3) = (nthcdr 3 x)
(setf y '(4 5 6))
; x = (a b c 1 10 3)
; y = (4 5 6)
答案 2 :(得分:0)
nconc将x的rest字段更改为指向y
的值。 值 y
是y指向的单元格。如果您将y
指针移至另一个目标,则x
的其余字段将不会更改,仍会指向(1 2 3)
。