什么情况需要让而不是让*?

时间:2015-04-06 15:09:57

标签: lisp common-lisp

我目前正在阅读“Common Lisp:一个温和的符号计算简介”。

第5章介绍letlet*并讨论它们之间的差异,并特别指出您可能会被欺骗以考虑始终使用let*而不是let ,但你不应该这样做有两个原因:

  1. let更容易理解,因为它暗示没有依赖关系。
  2. 第5.6节说有些情况let是唯一正确的选择,但不会详细说明。
  3. 实际上,它说:

      

    在某些情况下,LET是唯一正确的选择,但我们不会在此处详述。在风格上,最好在可能的情况下使用LET而不是LET *,因为这表明读取程序的任何人都在创建的局部变量之间没有依赖关系。具有较少依赖性的程序更容易理解。

    所以,现在我的问题是:let是唯一正确选择的情况是什么?

1 个答案:

答案 0 :(得分:5)

主要是关于您想要引用的变量。

(let ((p 'foo))
   (let or let*    ; use of those
       ((p 'bar)
        (q p))     ; which p do you want? The first or the second?
     (list p q)))

试一试:

CL-USER 60 > (let ((p 'foo))
               (let ((p 'bar)
                     (q p))
                 (list p q)))
(BAR FOO)

CL-USER 61 > (let ((p 'foo))
               (let* ((p 'bar)
                      (q p))
                 (list p q)))
(BAR BAR)

另请注意LET中存在间接依赖关系:绑定的值从左到右进行评估:

(let ((list '(1 2)))
  (let ((a (pop list))
        (b (pop list)))
   (list a b)))

上述表单的结果将始终为(1 2)