在LISP中,“let”和“with”的区别是什么?

3
一个简单的示例可以展示它们之间的区别,因为在我看来它们似乎是可以互换的?谢谢 :)
2个回答

1

它们确实在功能上等效。

事实上,至少SBCL会将loop宏调用中任何使用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))))))))

1

但是,“let”和“with”在功能上是等价的吗? - Combinator Logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接