我现在正在阅读"Common Lisp:一个温和的符号计算简介".
第5章介绍let并let*讨论了它们之间的差异,特别指出你可能会被欺骗思考总是使用let*而不是let,但你不应该这样做有两个原因:
let 更容易理解,因为它暗示没有依赖关系.let是唯一正确的选择,但它没有详细说明.实际上,它说:
在某些情况下,LET是唯一正确的选择,但我们不会在此处详述.在风格上,最好在可能的情况下使用LET而不是LET*,因为这表明读取程序的任何人都在创建的局部变量之间没有依赖关系.具有较少依赖性的程序更易于理解.
那么,现在我的问题是:这些情况在哪里let才是唯一正确的选择?
它主要是关于你想要引用的变量.
(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)))
Run Code Online (Sandbox Code Playgroud)
试试吧:
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)
Run Code Online (Sandbox Code Playgroud)
另请注意,存在间接依赖关系LET:从左到右评估绑定的值:
(let ((list '(1 2)))
(let ((a (pop list))
(b (pop list)))
(list a b)))
Run Code Online (Sandbox Code Playgroud)
上述形式的结果将始终如一(1 2).