在 LISP 中,“let”和“let”有什么区别?和“与”?

发布于 2025-01-02 22:44:28 字数 55 浏览 3 评论 0原文

一个简单的例子来展示行动上的差异确实会有帮助,因为对我来说,它们看起来都是可以互换的?谢谢 :)

A simple example to show the differences in action would really help, since to me they both just seem interchangeable? Thanks :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

巷雨优美回忆 2025-01-09 22:44:28

至少在 Common Lisp 中,您只能在 loop 宏的上下文中使用 with。请参阅 Common Lisp Hyperspec

In Common Lisp, at least, you can only use with in the context of a loop macro. See the Common Lisp Hyperspec.

懷念過去 2025-01-09 22:44:28

它们在功能上确实是等效的。

事实上,至少 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))))))))

They are indeed functionally equivalent.

In fact, at least SBCL expands any use of with in a loop macro invocation into an enclosing LET form.

Running the following:

(macroexpand '(loop with foo = 5 repeat 10 collect foo))

Results in the following expansion:

(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))))))))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文