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)
实际上不止一个 car
和 cdr
访问器具有 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 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)
我有一个 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)
实际上不止一个 car
和 cdr
访问器具有 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 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)