3
一個簡單的例子來顯示行動上的差異真的會有所幫助,因爲對他們來說,它們看起來都是可以互換的?謝謝:)在LISP中,「let」和「with」有什麼區別?
一個簡單的例子來顯示行動上的差異真的會有所幫助,因爲對他們來說,它們看起來都是可以互換的?謝謝:)在LISP中,「let」和「with」有什麼區別?
在Common Lisp中,至少只能在loop
宏的上下文中使用with
。請參閱Common Lisp Hyperspec。
它們確實在功能上等同。
事實上,至少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))))))))
但 「我們」 和 「與」 兩個功能上等同? – 2012-02-06 03:07:30