2015-04-05 78 views
1

我想分割一個序列使用LOOP。 我認爲最簡單的方法是收集所有元素的循環,但這似乎不可能與循環。 它看起來是這樣的:Common Lisp循環宏也收集其餘

(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)作爲第二個值)。 循環中是否有一個關鍵字可以執行此操作(或在迭代系統中),還是隻有通過編寫新的宏(或使用tagbody)纔有可能?

回答

3

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) 
+0

沒有,'return'作品,它也出現在環 - 在「Lisp Land」中的表格,但是「on」在那裏被描述爲與' – 2015-04-05 18:02:08

+1

@ cl-porky11'中的'相同,'RETURN'適用於這種情況。我正在考慮'FINALLY'形式...... – 2015-04-05 20:50:15

2

避免循環,但遍歷該列表的一部分,一個兩次簡短的選項:

(let ((tail (member 3 list))) 
    (values (ldiff tail list) tail))