Lisp,向后迭代

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))需要反转序列(甚至比第一个选项更糟糕).

zut*_*zut 5

对于列表,最简单的是(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添加项目.这从一开始就提供快速随机访问.

  • Lisp列表在一个方向链接,它们不是双向链表.有关唇部列表如何工作的示例,请参见http://www.gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html.这意味着您只能在基本列表上向一个方向迭代.您可以创建自己的双链接列表,例如这个 - > https://github.com/krzysz00/dlist (2认同)