let
避免混淆特殊形式 let
可以避免混淆。let
创建一个局部变量的名称,它会遮蔽任何在 let
表达式之外使用相同名称的情况。这就像理解当你的主机提到“房子”时,他指的是他的房子,而不是你的房子一样。(在参数列表中使用的符号也是同样的道理。See defun
宏.)
由 let
表达式创建的局部变量只在 let
表达式本身(以及在 let
表达式内调用的表达式中)中保持其值;这些局部变量在 let
表达式之外没有影响。
另一种理解 let
的方式是,它就像一个临时和局部的 setq
。由 let
设置的值在 let
结束时会自动撤销。这个设置只影响在 let
表达式边界内的表达式。在计算机科学的术语中,我们会说符号的绑定仅在 let
表单中调用的函数中可见;在 Emacs Lisp 中,默认的作用域是动态的,而不是词法的。 (非默认的词法绑定在本手册中未讨论。)
let
可以一次创建多个变量。此外,let
为它创建的每个变量都提供一个初始值,可以是你指定的值,也可以是 nil
。(在术语中,这是将变量绑定到值。)在 let
创建并绑定了变量之后,它会执行 let
主体中的代码,并返回主体中最后一个表达式的值,作为整个 let
表达式的值。(“执行”是一个术语,指的是评估列表;它源自“实施”一词的使用,意味着“实际生效”(Oxford English Dictionary)。由于你评估一个表达式来执行一个动作,“执行”已经演变为“评估”的同义词。)