我有一个nils (NIL NIL NIL NIL)的列表,我需要添加两个X来代替两个第一个NIL,所以它变成(XX NIL NIL)
我有以下代码:
(cons x (cons x (cons (cdr '(NIL NIL NIL NIL))nil)))
但是这样它会返回
(X X (NIL NIL))
需要删除这些药物,我不知道如何。有人能帮我吗? 感谢
答案 0 :(得分:3)
(list* X X (nthcdr 2 your-list))
函数NTHCDR返回列表,其中包含两个首先删除的元素&函数LIST *返回一个新的列表,在前面附加指定的项目。 因此,请注意,您将获得一个新列表,而不是修改原始列表。如果你真的想要修改原始列表(这可能是一个坏主意,请谨慎行事),你可以完成任务:
(setf (first your-list) 'X)
(setf (second your-list) 'X)
修改这样的列表可能会导致修改看似无关的数据。无论如何,它与引用的文字列表不兼容。
答案 1 :(得分:3)
如果您将列表传递给cons
的第一个参数,那么您将创建嵌套列表。首先让我们说出我们的初始列表和符号x
变量:
(defparameter *nils* '(nil nil nil nil))
*nils* ; ==> (nil nil nil nil)
(defparameter *x* 'x)
*x* ; ==> x
那么我们如何首先删除这两个。好吧,我们可以删除一个(cdr *nils*)
,这意味着我们可以做两次:
(cdr (cdr *nils*))
; ==> (nil nil)
实际上,多个car
和cdr
访问者有一个简写最多5个组合。简写就是以c开头,然后用a / d来结束,并以r结束:
(cddr *nils*)
; ==> (nil nil)
Goodie,我们如何在前面添加*x*
?好cons
被定义为在第二个参数前面创建一个元素,因此(cons *x* (cddr *nils*)) will make
(x nil nil). Again if you want to have another
x `在你做的前面与结果相同:
(cons *x* (cons *x* (cddr *nils*)))
; ==> (x x nil nil)
使用list*
就像嵌套的cons一样尾巴。因此,上面的代码可以替换为:
(list* *x* *x* (cddr *nils*))
; ==> (x x nil nil)
现在将存储的表达式替换为变量(替换方法):
(list* 'x 'x (cddr '(nil nil nil nil)))
; ==> (x x nil nil)