反向LISP列表到位

lin*_*ndy 1 lisp

我想编写一个反转列表元素的函数,但它应该就位(也就是说,不要创建一个新的反转列表).

就像是:

>> (setq l ' (a b c d))
((a b c d)
>> (rev l)
(d c b a)
>> l
(d c b a)
Run Code Online (Sandbox Code Playgroud)

我应该遵循什么标志才能实现这一目标?

Jef*_*ter 8

看看nreverse哪个会修改列表(参见HyperSpec).

根据评论,请注意@Barmar所做的评论以及规范中的这一点:

对于nreverse,序列可能会被破坏并重新用于生成结果.结果可能与序列相同,也可能不同.具体来说,当sequence是一个列表时,nreverse允许设置任何属于序列列表结构的cons的任何部分,car或cdr.

  • 请注意,您需要将其分配回变量,例如`(setq l(nreverse l))`.它重用原始列表元素,但不同的缺点可能是结果的头部. (12认同)