LISP - 替换列表中的值

时间:2017-11-29 21:39:37

标签: lisp common-lisp lispworks

我有一个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))

需要删除这些药物,我不知道如何。有人能帮我吗? 感谢

2 个答案:

答案 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)

实际上,多个carcdr访问者有一个简写最多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)