0

我在理解 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 的其余字段更改为指向 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 地址处的数据?

在此先感谢迈克尔

4

3 回答 3

4

Lisp 变量不指向固定内存。它们指向 Lisp 数据对象。设置变量不会更改任何对象内存。该变量只是指向一些其他数据。

于 2013-02-03T20:49:47.003 回答
2

因为最后一个consinx设置为指向指向的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)
于 2013-02-03T19:28:26.867 回答
0

nconc 将 x 的其余字段更改为指向的y y是 y 指向的单元格。如果您将y指针移动到另一个目标, 的其余字段x将不会改变,并且仍将指向(1 2 3)

于 2013-02-03T19:32:19.853 回答