LISP - 替换列表中的值

LISP - Replace values in a list

我有一个 nils 列表 (NIL NIL NIL NIL) 我需要添加两个 X 来代替前两个 NIL,所以它变成 (X X 零零).

我有以下代码:

(cons x (cons x (cons (cdr '(NIL NIL NIL NIL))nil)))

但是这样 returns

(X X (NIL NIL))

那些括号需要删除,我不知道如何删除。有人能帮我吗? 谢谢

(list* X X (nthcdr 2 your-list))

函数 NTHCDR returns 删除了两个第一个元素的列表 & 函数 LIST* returns 一个在前面附加指定项目的新列表。 请注意,您因此获得了一个新列表,而不是修改原始列表。如果你真的想修改原始列表(这很可能是个坏主意,请谨慎行事),你可以直接赋值:

(setf (first your-list) 'X)
(setf (second your-list) 'X)

像这样修改列表可能会导致修改看似无关的数据。无论如何,它与引用的文字列表不兼容。

如果您将列表传递给 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 访问器具有 shorthand 最多 5 种组合。 shorthand 只是以 c 开始并执行 a/d 并以 r 结束,如下所示:

(cddr *nils*)
; ==> (nil nil)

亲,前面怎么加上*x*cons 定义为在第二个参数前面创建一个元素,因此 (cons *x* (cddr *nils*)) will make(x nil nil). Again if you want to have anotherx` 在前面你对第一个结果做同样的事情:

(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)