是否有一种方法(使用循环或迭代,没关系)来向后迭代序列?
除了(loop for i downfrom 10 to 1 by 1 do (print i))
和索引(loop for elt in (reverse seq))
之外,pre
与索引一起使用并需要长度,而\n
则需要反转顺序(甚至比第一个选项还差)。
答案 0 :(得分:5)
对于列表,最简单的方法是(dolist (x (reverse list)) ..)
,如果可以修改列表,则使用效率更高的nreverse
。
对于向量,可以选择dotimes
进行索引计算,例如:
(let* ((vec #(1 2 3))
(len (length vec)))
(dotimes (i len)
(print (aref vec (- len i 1)))))
通常,列表从头开始迭代,每个缺点指向下一个。从背面进行操作本质上效率低下。
如果您仍然有列表并希望快速反向访问或随机访问,则可以选择使用(coerce my-list 'array)
将其强制为向量,然后使用aref
访问元素(或强制为{{ 1}},然后使用simple-vector
)。
如果您是构建列表的人,请考虑使用填充指针创建可调矢量(请参见svref
文档),然后使用make-array
添加项目。从一开始就可以快速进行随机访问。
答案 1 :(得分:2)
(iterate (for x :in-sequence #(1 2 3) :downto 0)
(princ x))
; => 321
正如其他人所指出的,如果在列表上使用,这将非常无效。