And*_* S. 0 lisp iteration common-lisp
有没有办法(使用循环或迭代,无关紧要)向后迭代序列?
除了(loop for i downfrom 10 to 1 by 1 do (print i))使用索引,需要长度,或(loop for elt in (reverse seq))需要反转序列(甚至比第一个选项更糟糕).
对于列表,最简单的是(dolist (x (reverse list)) ..),nreverse如果可以修改列表,则使用效率更高的列表.
对于向量,另一种方法是dotimes使用索引计算,例如:
(let* ((vec #(1 2 3))
(len (length vec)))
(dotimes (i len)
(print (aref vec (- len i 1)))))
Run Code Online (Sandbox Code Playgroud)
通常,列表从一开始就被迭代,因为每个缺点指向下一个.从后面做它本质上是低效的.
如果您有一个列表并希望快速反向或随机访问,则可以选择使用eg将其强制转换为向量(coerce my-list 'array),然后使用aref(或强制simple-vector使用svref)访问元素.
如果您是构建列表的人,请考虑使用填充指针创建可调整向量(请参阅make-array文档),然后使用vector-push-extend添加项目.这从一开始就提供快速随机访问.