2012-02-06 5 views

答えて

1

少なくとも、マクロのコンテキストでwithしか使用できません。 Common Lisp Hyperspecを参照してください。

+0

をしかし、次の展開に

(macroexpand '(loop with foo = 5 repeat 10 collect foo)) 

結果:

次のことを実行していますか? –

1

実際に機能的に同等です。

実際、少なくともSBCLはマクロ呼び出しでwithの使用を、囲みのあるLET形式に展開します。両方の機能的に同等 "と" "せ" とされている

(BLOCK NIL 
    (LET ((FOO 5)) 
    (LET ((#:LOOP-REPEAT-1681 (CEILING 10))) 
     (DECLARE (TYPE INTEGER #:LOOP-REPEAT-1681)) 
     (SB-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD (#:LOOP-LIST-HEAD-1682 
               #:LOOP-LIST-TAIL-1683) 
     (SB-LOOP::LOOP-BODY NIL 
          ((IF (<= #:LOOP-REPEAT-1681 0) 
           (GO SB-LOOP::END-LOOP) 
           (DECF #:LOOP-REPEAT-1681))) 
          ((SB-LOOP::LOOP-COLLECT-RPLACD 
           (#:LOOP-LIST-HEAD-1682 #:LOOP-LIST-TAIL-1683) 
           (LIST FOO))) 
          ((IF (<= #:LOOP-REPEAT-1681 0) 
           (GO SB-LOOP::END-LOOP) 
           (DECF #:LOOP-REPEAT-1681))) 
          ((RETURN-FROM NIL 
           (SB-LOOP::LOOP-COLLECT-ANSWER 
           #:LOOP-LIST-HEAD-1682)))))))) 
関連する問題