2016-04-23 75 views
1

我正在嘗試使用循環宏來過濾列表。如果我做使用通用lisp循環宏進行過濾

(loop for x in (list 1 2 3 4) collect x) 

我只是得到相同的名單,這是有道理的。不過,我想這樣做

(loop for x in (list 1 2 3 4) collect x if (evenp x)) 

,並得到(2 4)回來,但是這是不合法的。出於某種原因,我無法在其他文檔上找到適當的語法。這可能嗎?

+3

「我無法找到合適的語法這對其他文檔。」 HyperSpec是非常合理的文檔。 [** loop **]的條目(http://www.lispworks.com/documentation/HyperSpec/Body/m_loop.htm)包含一個語法,相關的生產是'conditional :: = {if |當|時除非}形式selectable-clause {和selectable-clause} * [else selectable-clause {和selectable-clause} *] [end]'。你只需要改變順序爲**如果(evenp x)收集x **(儘管如果你不使用** else **,那麼當**時**會更加慣用)。 –

回答

6

正確的語法是

(loop for x in (list ...) when (evenp x) collect x) 
+0

或者'(如果(evenp x)收集x)'中的循環(列表...)。 – Vatine