3

アクションの違いを示す簡単な例は、私にはどちらも交換可能に見えるので、本当に役に立ちますか? ありがとう :)

4

2 に答える 2

1

それらは確かに機能的に同等です。

実際、少なくとも SBCL はwithloopマクロ呼び出しでの の使用を囲みLET形式に拡張します。

以下を実行します。

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

次の展開になります。

(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))))))))
于 2012-02-06T03:28:56.437 に答える
1

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

于 2012-02-06T03:01:55.613 に答える