复杂情况

首先介绍第一种复杂情况。 除了列表,Lisp 解释器还可以对未加引号、也没有括号包裹的符号进行求值。 解释器会尝试获取该符号作为 变量(variable) 的值。 这一场景会在变量相关章节详细说明。(See 变量.)

第二种复杂情况源于部分函数的特殊性,它们并不遵循常规的执行方式。 这类函数被称为 特殊形式(special forms)。它们用于完成定义函数等特殊任务,数量并不多。 在接下来的几章中,我们会介绍几种较为重要的特殊形式。

除了特殊形式,还有 宏(macros)。宏是在 Lisp 中定义的一种结构, 它与函数的区别在于:宏会将一个 Lisp 表达式转换为另一个表达式, 并使用转换后的表达式替代原表达式进行求值。(See Lisp 宏.)

就本入门教程而言,你不必过于纠结某个结构是特殊形式、宏还是普通函数。 例如,if 是特殊形式 (see if 特殊形式),而 when 是宏 (see Lisp 宏)。 在早期版本的 Emacs 中,defun 是特殊形式,现在则是宏 (see defun),但其行为保持不变。

最后一种复杂情况:如果 Lisp 解释器处理的函数不是特殊形式,且属于某个列表, 解释器会检查该列表中是否嵌套了其他列表。 如果存在内层列表,解释器会先处理内层列表,再处理外层列表。 如果内层列表中还嵌套了其他列表,则优先处理最内层的列表,以此类推。 解释器总是优先对最内层列表求值,其结果会被外层表达式使用。

除此之外,解释器会按照从左到右的顺序依次处理每个表达式。