2010-11-20 4 views
4

次Common Lispのコードは、私はそれを期待される出力を生成しません:Common Lispの "loop for"マクロは、複数の "and" edカウンタでどのように動作しますか?

5 5 
6 5 
7 6 
8 7 
9 8 
10 9 

私はaとbの値を期待していた。

(loop for a from 5 to 10 
     and b = a do 
     (format t "~d ~d~%" a b)) 

がSCBLを使用するには、それはこの出力を生成します各行で同じである。

私は、このインスタンスのループマクロの良いドキュメントをウェブで検索しましたが、多くを見つけることができませんでした。私はどんな洞察にも感謝します!

答えて

11
(loop for a from 5 to 10 
     and b = a 
     do (format t "~d ~d~%" a b)) 

PSETFと概念的に近い見ることができます。値は 'parallel'で更新されます。理由はANDです。

はのは、元に戻して、FORてみましょう:

(loop for a from 5 to 10 
     for b = a 
     do (format t "~d ~d~%" a b)) 

上記は通常のSETF、「順次」に概念的に近い変数を更新します。説明のため

CL-USER 20 > (loop for a from 5 to 10 
        for b = a 
        do (format t "~d ~d~%" a b)) 
5 5 
6 6 
7 7 
8 8 
9 9 
10 10 

Common Lisp HyperSpec 6.1.2.1 Iteration Control参照:

複数の反復句を反復を制御する を使用する場合、変数 初期化及びステッピングは、デフォルトで 順次発生します。 順次バインディングおよびステッピングが である場合、および構造を使用して、2つの繰り返し節を接続することができます。 によって接合句の繰り返し挙動 は *を行うに に関してを行うマクロの挙動に 類似しています。

+1

分かりやすい説明をいただきありがとうございます。 – presto8

3

変数のいずれかに新しい値が与えられる前に、AND句のステップ形式が評価されます。代わりにfor b = a then aを使用して、順序どおりの評価を強制してください。

Ref。上記のコードhttp://www.gigamonkeys.com/book/loop-for-black-belts.html#equals-then-iteration

+0

ありがとうございました!私は「b = a then a」を試みましたが、残念なことに同じ出力を生成しました。 – presto8

+0

@ presto8まあ、それは私のために働く、私が言うことができるすべてです。 –

+0

興味深い。私はSBCLとLispWorksで "a then"を試みましたが、同じ結果が出ました。ああ、とにかくありがとう! – presto8

関連する問題