3

一个显示动作差异的简单示例真的会有所帮助,因为对我来说它们似乎都可以互换?谢谢 :)

4

2 回答 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 回答