2012-02-06 27 views

回答

1

在Common Lisp中,至少只能在loop宏的上下文中使用with。請參閱Common Lisp Hyperspec

+0

但 「我們」 和 「與」 兩個功能上等同? – 2012-02-06 03:07:30

1

它們確實在功能上等同。

事實上,至少SBCL將宏中的with的任何使用擴展爲封閉的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)))))))) 
相關問題