并行迭代
在 LOOP
中允许多个 FOR
条款。当第一个子句结束时,循环结束:
(loop for a in '(1 2 3 4 5)
for b in '(a b c)
collect (list a b))
;; Evaluates to: ((1 a) (2 b) (3 c))
确定循环是否应该继续的其他子句可以组合使用:
(loop for a in '(1 2 3 4 5 6 7)
while (< a 4)
collect a)
;; Evaluates to: (1 2 3)
(loop for a in '(1 2 3 4 5 6 7)
while (< a 4)
repeat 1
collect a)
;; Evaluates to: (1)
确定哪个列表更长,一旦知道答案就切断迭代:
(defun longerp (list-1 list-2)
(loop for cdr1 on list-1
for cdr2 on list-2
if (null cdr1) return nil
else if (null cdr2) return t
finally (return nil)))
编号列表的元素:
(loop for item in '(a b c d e f g)
for x from 1
collect (cons x item))
;; Returns ((1 . a) (2 . b) (3 . c) (4 . d) (5 . e) (6 . f) (7 . g))
确保列表中的所有数字均匀,但仅适用于前 100 个项目:
(assert
(loop for number in list
repeat 100
always (evenp number)))