替换Common Lisp列表中的项目?

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)

应该做的伎俩.

  • 是的,除了你不能在常见的lisp中使用t作为变量名,因为它也是真值符号. (3认同)
  • 名为“T”的符号没问题,只是它不能是属于“COMMON-LISP”包的符号。:) (2认同)

haz*_*zen 8

你多久会这样做; 如果你真的想要一个数组,你应该使用一个数组.否则,是的,一个函数使得包含前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)


Dan*_*reb 6

(setf (nth N L) T)
Run Code Online (Sandbox Code Playgroud)

如果您想要做的是"破坏性"修改,即实际更改现有列表,则是最清晰,最简洁,最快捷的方式.它不分配任何新内存.


Dav*_*ton 1

听起来你想要 rplaca 或更换。请参阅http://www.lispworks.com/documentation/HyperSpec/Body/f_rplaca.htmhttp://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm#replace

  • 大概是太麻烦了。(setf (nth NL) T),正如 l0st3d 所建议的,用最少的代码做正确的事情。 (2认同)