我正在学习 lisp,我对此很陌生,所以我想知道...
如果我这样做:
(defparameter *list-1* (list 1 2))
(defparameter *list-2* (list 2 3))
(defparameter *list-3* (append *list-1* *list-2*))
然后
(setf (first *list-2*) 1)
*list-3*
我会得到 (1 2 1 4)
我知道这是因为追加将“节省资源”并为第一个 block 创建一个新列表,但实际上只会指向第二个 block ,因为如果我这样做:
(setf (first *list-1*) 0)
*list-3*
我会得到 (1 2 1 4) 而不是更合乎逻辑的 (0 2 1 4)
所以我的问题是,在 lisp 中还有哪些其他情况是这样的,你们黑带 lispers 如何知道如何处理这种不直观或不一致的东西?
最佳答案
一种防御策略是避免共享结构。
(defparameter *list-3* (append *list-1* *list-2* '()))
或
(defparameter *list-3* (append *list-1* (copy-list *list-2*)))
现在新的*list-3*
的结构是全新的,对*list-3*
的修改不会影响*list- 2*
反之亦然。
关于list - LISP 非常简单的列表题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/426991/