list - LISP 非常简单的列表题

标签 list lisp

我正在学习 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/

相关文章:

lisp - Racket 博士中的mcons

list - 删除列表中的特定项目?

python - 用空格分隔的文本在 python 中打印列表列表

Python:将列表传递给另一个列表但列表为空

java - 搜索对象特定属性的最佳方法

lisp - 获取彩票号码

lisp - (define ...) 的嵌套应用程序之间的竞争条件?

list - Clojure:移动列表中的项目

c# - 在c#中查找列表的最大长度

emacs - 在选定区域的 Ctrl+C 之前更改速度会激活复制命令,而不是允许在区域上执行其他命令