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
适用于这种情况。我最后想到的是
表格。。。