アクションの違いを示す簡単な例は、私にはどちらも交換可能に見えるので、本当に役に立ちますか? ありがとう :)
2 に答える
1
それらは確かに機能的に同等です。
実際、少なくとも SBCL はwith
、loop
マクロ呼び出しでの の使用を囲み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 に答える