“ eli *”(让星号)在elisp中是什么意思


12

我已经使用let过,但从来没有使用过let* 什么let*(让星号)意味着elisp的?

仅供参考,由于星号,这很难谷歌。

Answers:


17

这意味着,当有多个绑定时,变量将顺序绑定,因此每个变量都可以依赖于绑定到绑定前的值,即let*绑定中位于绑定前的值。

对于let(不带星号),不能假定任何绑定都在其他任何绑定之前发生(原则上可以并行绑定变量)。

所以(let ((a 42) (b a))...b),因为它试图绑定可以提高一个错误b,它的值a,并且a(至少处于特殊a的是在此约束let)不能被假定为已绑定到一个值。

[如果一些其他的(例如全局)变量a 绑定到值,例如5,则该let表达式将结合其(本地)a42并结合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 iElispi let*let*

(该手册通常涵盖的内容比此处要好,因为成千上万的贡献者花费了大量的时间和精力来使它正确:正确和完整。)


您也可以在该网站上搜索使用标签的问题和答案let-binding:只需将其放在[let-binding]搜索字段中即可。(我现在要这样做,看看这个问题是否可能是重复的...)


上面的示例中有一个错字,当b等于5时是因为它绑定到global a。它应该阅读let,而不是let*

@jue:对;谢谢。
提请

也可以通过询问功能F1 f
DoMiNeLa10

@ DoMiNeLa10:确实;好点子。由于评论可以随时删除,因此我更新了答案以提及此。谢谢。
德鲁

5

let*就像递归的let意思:

(let* ((var1 VAL1)
       (var2 VAL2))
  ...)

就好像

(let ((var1 VAL1))
  (let ((var2 VAL2))
    ...))

因此,使用大写字母表示VAL1VAL2也可以是表达式。

let如果VAL2实际依赖,则递归绑定会产生后果var1。在Drew的答案中已经描述了这种效果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.