现在,我们来看第一个复杂情况。除了列表,Lisp 解释器还可以对没有引号且没有被括号包围的单个符号进行评估。在这种情况下,Lisp 解释器会试图确定该符号作为变量的值。这种情况我们会在变量部分进行描述。(See 变量.)
第二个复杂情况是,有一些函数的工作方式与常规函数不同,那些不同寻常的函数被称为特殊形式。它们用于处理特定任务,比如定义函数,而且数量并不多。在后续章节中,您会了解到一些更重要的特殊形式。
除特殊形式外,还有宏。宏是Lisp中定义的一种构造,不同于函数的地方在于,它会将一个Lisp表达式转换成另一个要代替原始表达式进行评估的表达式。(See Lisp macro。)
就本书而言,您无需过于担心某个东西是特殊形式、宏还是普通函数。例如,if
是一个特殊形式(see 特殊形式 if
),而when
是一个宏(see Lisp macro)。在Emacs的早期版本中,defun
是一个特殊形式,但现在它是一个宏(see defun
宏),不过它的用法没有改变。
最后一个复杂情况是:如果Lisp解释器正在处理的函数不是特殊形式,并且它是列表的一部分,Lisp解释器会检查这个列表是否包含内部列表。如果存在内部列表,Lisp解释器先确定应该如何处理内部列表,然后再处理外部列表。如果内部列表中还嵌套了另一个列表,它还会先处理那个列表,以此类推。解释器总是先处理最内层的列表。它会首先对最内层列表进行评估,得到结果用于外层表达式。
否则,解释器会从左到右顺序处理表达式,每个表达式依次处理。