Ber*_*ert 13 lisp append common-lisp
可能重复:
将项目添加到列表末尾的"缺点"是什么?
在看了很多关于lisp的教程并在谷歌搜索高低搜索后,我仍然无法弄清楚如何添加到LISP列表的末尾.
我希望我的功能'a
在列表的末尾添加,'(b c d)
但我只知道如何在前面添加它.有人可以帮我正确使用缺点添加'a
到列表的末尾?这是我的代码.提前致谢.
(defun AddRt (a list)
(cond
((null list)
0)
(t
(princ (cons a (cons (car list) (cdr list))))
)))
(AddRt 'a '(b c d))
Run Code Online (Sandbox Code Playgroud)
sds*_*sds 17
> (defparameter a (list 1 2 3))
A
> (push 4 (cdr (last a)))
(4)
> a
(1 2 3 4)
> (nconc a (list 5))
(1 2 3 4 5)
> a
(1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)
注意,这些都是破坏性的 运营商,即它们修改的是对象价值的a
,而不仅仅是结合的a
.
这就是为什么,BTW,你永远不应该nconc
在引用列表上使用,比如(nconc '(1 2 3) '(4 5 6))
.
PS.请注意,添加到列表末尾需要完全
遍历,因此是一个O(length(list))
操作.如果您的列表很长,这可能是一个坏主意,所以人们经常使用
push
/ nreverse
idiom,例如,
(let (range)
(dotimes (i 10 (nreverse range))
(push i range)))
==> (0 1 2 3 4 5 6 7 8 9)
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以使用递归函数.另外,你应该避免在里面使用princ.
以下函数endcons与cons完全相同,只是在最后添加了值.
(defun endcons (a v)
(if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))
(endcons 'a '(b c d))
Run Code Online (Sandbox Code Playgroud)
当然,你也可以使用append:
(append '(b c d) '(a))
Run Code Online (Sandbox Code Playgroud)
另请参阅此相关问题:将项目添加到列表末尾的"缺点"是什么?