2016-04-23 11 views
1

Ich versuche, eine Liste mit dem Loop-Makro zu filtern. Wenn ich das tueFilterung mit sammeln in gemeinsamen Lisp Schleife Makro

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

Ich bekomme nur die gleiche Liste zurück, die Sinn macht. Ich möchte jedoch etwas tun, wie

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

und (2 4) zurück zu bekommen, aber das ist nicht legal. Aus irgendeinem Grund kann ich die entsprechende Syntax für andere Dokumentation nicht finden. Ist das möglich?

+3

„Ich habe nicht die entsprechende Syntax für diese auf andere Dokumentation finden.“ Die HyperSpec ist eine ziemlich vernünftige Dokumentation. Der Eintrag für [** loop **] (http://www.lispworks.com/documentation/HyperSpec/Body/m_loop.htm) enthält eine Grammatik, und die relevante Produktion ist 'conditional = = {if | wenn | es sei denn} form selectable-clause {und selectable-clause} * [else selected-clause {und selectable-clause} *] [end] '. Sie müssen nur die Reihenfolge ändern, um ** wenn (evenp x) sammeln x ** (obwohl, wenn Sie nicht ** sonst ** verwenden, dann ** wenn ** wäre idiomatisch). –

Antwort

6

Die korrekte Syntax ist

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

Alternativ '(Schleife für x in (Liste ...) if (evenp x) sammeln x)'. – Vatine