Lisp,向后迭代

时间:2018-10-24 11:41:00

标签: iteration lisp common-lisp

是否有一种方法(使用循环或迭代,没关系)来向后迭代序列?

除了(loop for i downfrom 10 to 1 by 1 do (print i))和索引(loop for elt in (reverse seq))之外,pre与索引一起使用并需要长度,而\n则需要反转顺序(甚至比第一个选项还差)。

2 个答案:

答案 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 can do it

(iterate (for x :in-sequence #(1 2 3) :downto 0)
         (princ x))
; => 321

正如其他人所指出的,如果在列表上使用,这将非常无效。

相关问题