我有一个列表(我称之为L),索引(N)和新事物(NEW).如果我想用N替换L中的L,那么最好的方法是什么?我应该将子列表最多N,从N到列表的末尾,然后使用列表将第一部分,NEW和最后部分的新列表粘合在一起?或者有更好的方法吗?
(setf (nth N L) NEW)
应该做的伎俩.
你多久会这样做; 如果你真的想要一个数组,你应该使用一个数组.否则,是的,一个函数使得包含前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)))))
(setf (nth N L) T)
如果您想要做的是"破坏性"修改,即实际更改现有列表,则是最清晰,最简洁,最快捷的方式.它不分配任何新内存.