List 使用lisp将变量追加到列表列表

List 使用lisp将变量追加到列表列表,list,lisp,common-lisp,List,Lisp,Common Lisp,我的清单定义如下: (defparameter testlist '(((a b) (c d)) ((e f) (g h ))) ) 我还有一个变量定义为: (defparameter feature 'u) 我想在(cd)中附加一个功能 当我尝试时: (setf (nth 1 (nth 0 testlist)) (append (nth 1 (nth 0 testlist)) feature)) testlist变成: (((A B) (C D . U)) ((E F) (G H)))

我的清单定义如下:

(defparameter testlist '(((a b) (c d)) ((e f) (g h ))) )
我还有一个变量定义为:

(defparameter feature 'u)
我想在
(cd)
中附加一个功能

当我尝试时:

(setf (nth 1 (nth 0 testlist)) (append (nth 1 (nth 0 testlist)) feature)) 
testlist
变成:

(((A B) (C D . U)) ((E F) (G H)))
但是,我想要一个非虚线列表


我不明白为什么会有这个结果。你能解释一下为什么或者建议一个更好的附加方法,这对初学者来说是可以理解的吗?

首先,你的
功能不是一个列表
append
允许最后一个参数为任意值,但如果最后一个元素本身不是正确的列表,则结果将不是正确的列表。因此:

(append '(1 2) 3)        ; ==> (1 2 . 3)
(append '(1 2) '(3 . 4)) ; ==> (1 2 3 . 4)
(append '(1 2) '(3 4))   ; ==> (1 2 3 4)
因此,如果希望
功能
成为要替换列表中的一个元素,而不是新的虚线值,则需要附加
(列表功能)

在需要重新创建之前,您需要找到正在更改的列表和所有内容,但在与原始源共享之后,您需要找到所有内容:

查看您的结构,您希望更改
cadar
,同时需要重新创建
caar
,而结果可以共享
cdr

(let ((lst '(((a b) (c d)) ((e f) (g h )))) (feature 'x))
  (list* (list (caar lst) (append (cadar lst) (list feature))) (cdr lst)))
; ==> (((a b) (c d x)) ((e f) (g h)))

现在,如何选择使用该结果取决于您。您可以
setf
绑定,除了不必要的后果外,您的行为将与您突变时的行为相同

首先,您的
功能
不是一个列表
append
允许最后一个参数为任意值,但如果最后一个元素本身不是正确的列表,则结果将不是正确的列表。因此:

(append '(1 2) 3)        ; ==> (1 2 . 3)
(append '(1 2) '(3 . 4)) ; ==> (1 2 3 . 4)
(append '(1 2) '(3 4))   ; ==> (1 2 3 4)
因此,如果希望
功能
成为要替换列表中的一个元素,而不是新的虚线值,则需要附加
(列表功能)

在需要重新创建之前,您需要找到正在更改的列表和所有内容,但在与原始源共享之后,您需要找到所有内容:

查看您的结构,您希望更改
cadar
,同时需要重新创建
caar
,而结果可以共享
cdr

(let ((lst '(((a b) (c d)) ((e f) (g h )))) (feature 'x))
  (list* (list (caar lst) (append (cadar lst) (list feature))) (cdr lst)))
; ==> (((a b) (c d x)) ((e f) (g h)))

现在,如何选择使用该结果取决于您。您可以
setf
绑定,除了不必要的后果外,您的行为将与您突变时的行为相同

(附加…(列表功能))
?否。。我可以改用push吗?push提供了我正在寻找的正确解决方案:(push功能(cdr(last(nth 1(nth 0 testlist)))),因为
testlist
是一个文本,因此uimmutable变异它可能会有意外和未定义的行为。
(append…(list feature))
?否。。我可以改用push吗?push提供了我正在寻找的正确解决方案:(push特性(cdr(last(nth 1(nth 0 testlist)))),因为
testlist
是一个文本,因此uimmutable对它进行变异可能会产生意外和未定义的行为。