Answers:
这意味着,当有多个绑定时,变量将顺序绑定,因此每个变量都可以依赖于绑定到绑定前的值,即let*
绑定中位于绑定前的值。
对于let
(不带星号),不能假定任何绑定都在其他任何绑定之前发生(原则上可以并行绑定变量)。
所以(let ((a 42) (b a))...b)
,因为它试图绑定可以提高一个错误b
,它的值a
,并且a
(至少处于特殊a
的是在此约束let
)不能被假定为已绑定到一个值。
[如果一些其他的(例如全局)变量a
绑定到值,例如5
,则该let
表达式将结合其(本地)a
到42
并结合b
到全球的值a
,即,5
。]
但是会(let* ((a 42) (b a))...b)
返回,42
因为a
绑定到42
,然后 b
绑定到的值a
。
请参见Elisp手册,节点局部变量。
通过@ DoMiNeLaLa10的提醒在评论中进行更新:
除了手册之外,您还可以使用帮助命令。在“询问Emacs”的各种方式中,它们是最先学习也是最有用的方法之一。
而对于C-h f let*
告诉我们,简洁:Each VALUEFORM can refer to the symbols already bound by this VARLIST.
尽管在这里提出问题没有错,但是如果您向Emacs提出这样的问题,您也会帮自己一个忙。只需使用打开手册的信息浏览器,选择手册,并使用它在索引中查找(完成)。这直接将您带到涵盖此内容的节点。C-h i
Elisp
i let*
let*
(该手册通常涵盖的内容比此处要好,因为成千上万的贡献者花费了大量的时间和精力来使它正确:正确和完整。)
您也可以在该网站上搜索使用标签的问题和答案let-binding
:只需将其放在[let-binding]
搜索字段中即可。(我现在要这样做,看看这个问题是否可能是重复的...)
F1 f
。
b
等于5时是因为它绑定到globala
。它应该阅读let
,而不是let*