Pau*_*cks 23 lisp replace list common-lisp
我有一个列表(我称之为L),索引(N)和新事物(NEW).如果我想用N替换L中的L,那么最好的方法是什么?我应该将子列表最多N,从N到列表的末尾,然后使用列表将第一部分,NEW和最后部分的新列表粘合在一起?或者有更好的方法吗?
l0s*_*t3d 25
(setf (nth N L) NEW)
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.
你多久会这样做; 如果你真的想要一个数组,你应该使用一个数组.否则,是的,一个函数使得包含前N个元素,新元素和尾部的副本的新列表都可以.我不知道我的头顶内置,但我有一段时间没有用Lisp编程.
这是Scheme中的一个解决方案(因为我知道它比Common Lisp更好,并且有一个解释器来检查我的工作):
(define (replace-nth list n elem)
(cond
((null? list) ())
((eq? n 0) (cons elem (cdr list)))
(#t (cons (car list) (replace-nth (cdr list) (- n 1) elem)))))
Run Code Online (Sandbox Code Playgroud)
(setf (nth N L) T)
Run Code Online (Sandbox Code Playgroud)
如果您想要做的是"破坏性"修改,即实际更改现有列表,则是最清晰,最简洁,最快捷的方式.它不分配任何新内存.
听起来你想要 rplaca 或更换。请参阅http://www.lispworks.com/documentation/HyperSpec/Body/f_rplaca.htm或http://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm#replace