Common Lisp 循环宏也收集休息
Common Lisp loop-macro also collect rest
我想使用 LOOP
拆分序列。
我认为最简单的方法是循环收集所有元素,但这似乎无法通过循环实现。
它看起来像这样:
(loop for i in '(1 2 3 4 5) with-rest rest
if (not (= i 3))
collect i
else
return (values i rest))
它应该 return 值 (1 2)
和 (3 4 5)
(或者可能 (4 5)
作为第二个值)。
循环中是否有关键字可以做到这一点(或在迭代系统中),或者这是否只能通过编写新宏(或使用标签体)来实现?
LOOP
可以将列表解构为头和尾。那么就不会使用in
,而是on
。也可以收集到变量中。
CL-USER 13 > (loop for (i . rest) on '(1 2 3 4 5)
if (not (= i 3))
collect i into head
else return (values head (cons i rest)))
(1 2)
(3 4 5)
或
CL-USER 16 > (loop with list = '(1 2 3 4 5)
for i in list
for rest on (rest list)
if (not (= i 3))
collect i into head
else return (values head (cons i rest)))
(1 2)
(3 4 5)
一个避免循环但遍历部分列表两次的简洁选项:
(let ((tail (member 3 list)))
(values (ldiff tail list) tail))
我想使用 LOOP
拆分序列。
我认为最简单的方法是循环收集所有元素,但这似乎无法通过循环实现。
它看起来像这样:
(loop for i in '(1 2 3 4 5) with-rest rest
if (not (= i 3))
collect i
else
return (values i rest))
它应该 return 值 (1 2)
和 (3 4 5)
(或者可能 (4 5)
作为第二个值)。
循环中是否有关键字可以做到这一点(或在迭代系统中),或者这是否只能通过编写新宏(或使用标签体)来实现?
LOOP
可以将列表解构为头和尾。那么就不会使用in
,而是on
。也可以收集到变量中。
CL-USER 13 > (loop for (i . rest) on '(1 2 3 4 5)
if (not (= i 3))
collect i into head
else return (values head (cons i rest)))
(1 2)
(3 4 5)
或
CL-USER 16 > (loop with list = '(1 2 3 4 5)
for i in list
for rest on (rest list)
if (not (= i 3))
collect i into head
else return (values head (cons i rest)))
(1 2)
(3 4 5)
一个避免循环但遍历部分列表两次的简洁选项:
(let ((tail (member 3 list)))
(values (ldiff tail list) tail))