Loops 公共Lisp循环宏也收集rest
我想使用Loops 公共Lisp循环宏也收集rest,loops,split,common-lisp,sequence,Loops,Split,Common Lisp,Sequence,我想使用循环拆分一个序列。 我认为最简单的方法是一个收集所有元素的循环,但这在循环中似乎是不可能的。 它看起来是这样的: (loop for i in '(1 2 3 4 5) with-rest rest if (not (= i 3)) collect i else return (values i rest)) 它应该返回值(1 2)和(3 4 5)(或者可能将(4 5)作为第二个值)。 循环中是否有关键字可以执行此操作(或在迭代系统中),
循环
拆分一个序列。
我认为最简单的方法是一个收集所有元素的循环,但这在循环中似乎是不可能的。
它看起来是这样的:
(loop for i in '(1 2 3 4 5) with-rest rest
if (not (= i 3))
collect i
else
return (values i rest))
它应该返回值(1 2)
和(3 4 5)
(或者可能将(4 5)
作为第二个值)。
循环中是否有关键字可以执行此操作(或在迭代系统中),或者只有通过编写新宏(或使用标记体)才能执行此操作?
loop
可以将列表分解为头和尾。那么就不会在中使用,而是在
上使用。您还可以收集到一个变量中
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)
或
LOOP
可以将列表分解为头和尾。那么就不会在
中使用,而是在
上使用。您还可以收集到一个变量中
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)
或
一个简洁的选项,可避免循环,但会遍历列表的一部分两次:
(let ((tail (member 3 list)))
(values (ldiff tail list) tail))
一个简洁的选项,可避免循环,但会遍历列表的一部分两次:
(let ((tail (member 3 list)))
(values (ldiff tail list) tail))
不,return
有效,它也出现在“Lisp之地”的循环表中,但是上的与中的描述相同,在@cl-porky11右侧,return
适用于这种情况。我最后想到了表单…不,return
有效,它也出现在“Lisp之地”的循环表中,但是上的与中的描述相同,在@cl-porky11右侧,return
适用于这种情况。我最后想到的是表格。。。