2016-12-28 10 views
1

私はループ内で複数のリストを収集したいと思っています。Lisp:ループ内で複数のリストを収集

私はこれがループなしで実行できることは知っていますが、ループでもこれが可能かどうかは疑問でした。私はLOOP keyword is expectedが、私は収集が右whenまたはloop後に使用する必要がありますねというエラーが出る

(loop for var in list 
     (if (cond1 var) 
      (if (cond2 var) 
       collect into list1 
       collect into list2)) 
     finally (list list1 list2)) 

:私はこのような何かをしたいと思います。それを解決する方法はありますか?

答えて

3

あなたは問題のカップルを持っています。

まず、通常のLispコードをループ本体に入れたい場合は、doというキーワードが必要です。しかし、代わりにdowhenまたはifのキーワードを使用できます。

第2に、collectキーワードでは、リストに収集する式を指定する必要があります。 collect var into list1

第3に、finally句のフォームから値を返すには、(return expression)を使用する必要があります。

(loop for var in list 
    when (cond1 var) 
     if (cond2 var) 
     collect var into list1 
     else 
     collect var into list2 
    finally (return (list list1 list2))) 
+0

両方の回答は素晴らしいですが、これがすべて実行するために必要なものです。ありがとうございました –

2

あまりにも多くのかっこがありますか? loopには、Common Lispのs式とはまったく異なる独自の小さなサブ言語があります。

(loop :for var :in list 
     :when (cond1 var) 
     :if (cond2 var) 
      :collect var :into list1 
     :else 
      :collect var :into list2 
     :end 
     :end 
     :finally (return (list list1 list2))) 

加えて、私は:collect:finallyにちょうどそう評価あなたが(return ...)を使用する必要があるか、他あなたがnilを期待できるかを指定します。

私はloopキーワードのキーワードを使用して、他の記号と区別しています。それは単なるスタイルです。もちろん、インデントは無視され、読みやすくするために、:endはありません。しかし、この場合、loopが正しく解析されないため、:endのキーワードはすべて冗長です。私は決してloopウィズだ

..私は少し複雑な何かを得るたびに私は、Practical Common Lispからの章をLand of Lispの周期表やLoop for black beltsを使用する傾向があります。

Periodic table of Loop Macro

関連する問題