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)。由于你评估一个表达式来执行一个动作,“执行”已经演变为“评估”的同义词。)