一个显示动作差异的简单示例真的会有所帮助,因为对我来说它们似乎都可以互换?谢谢 :)
问问题
180 次
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
的上下文中使用。loop
请参阅Common Lisp Hyperspec。
于 2012-02-06T03:01:55.613 回答