2016-04-23 143 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