难以理解Lisp中的变量重新分配

时间:2013-02-03 18:57:11

标签: variables lisp

我在使用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地址的数据?

提前致谢 迈克尔

3 个答案:

答案 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)