1.1.1 Lisp原子

在Lisp中,我们一直称之为单词的东西被称为原子。这个术语来自于“原子”一词的历史含义,即“不可分割”。就Lisp而言,我们在列表中使用的单词不能再分割成更小的部分,仍然具有与程序的某个部分相同的含义;数字和单字符符号(如‘+’)也是如此。然而,与古代的原子不同,列表可以被分割成部分。 (See car cdr & cons Fundamental Functions.)

在列表中,原子之间由空格分隔。它们可以紧邻括号。

从技术上讲,Lisp中的列表由括号括起,括号内部包含由空格分隔的原子,或者括号内部包含其他列表,或者同时包含原子和其他列表。一个列表可以只包含一个原子,也可以什么都不包含。一个什么都不包含的列表看起来像这样:(),称为空列表。与其他东西不同,空列表既是原子又是列表。

原子和列表的打印表示被称为符号表达式,或更简洁地称为s-表达式。单词表达式本身可以指的是打印表示,也可以指的是计算机内部保存的原子或列表。通常,人们会不加区分地使用表达式一词。 (此外,许多文本中,形式也被用作表达式的同义词。)

顺便提一下,构成我们宇宙的原子最初被认为是不可分割的。但后来发现,原子并非不可分割。原子可以分裂成两个大致相等的部分,或者可以有部分组成从原子中分离出来。也就是说,原子在其真正性质被发现之前就被过早地命名了。在Lisp中,某些类型的原子,例如数组,也可以被分割成部分,但这种分割数组的机制与分割列表的机制不同。就列表操作而言,列表的原子是不可分割的。

与汉语词语的含义不同于单个汉字的含义一样,Lisp语言中的原子也不等同于组成它的字母。例如,熊猫,与"熊" 和 "猫"完全不同。

自然界中有许多种类的原子,而在Lisp中只有少数几种:例如,数字,比如37、511或1729,以及符号,比如‘+’、‘foo’或‘forward-line’。我们在上面的示例中列出的单词都是符号。在日常的Lisp对话中,“原子”这个术语很少被直接使用,因为程序员通常会尽量明确他们正在处理哪一类型的原子。Lisp编程主要涉及列表中符号的处理(有时还涉及数字)。(顺便一提,前文中的括号注释也是一个合法的Lisp列表,因为它由原子组成,这些原子是符号,被空格分隔并用括号括起,没有任何非Lisp符号。)

用双引号括起的文本,即使是句子或段落,也会被视为一个原子。下面是一个例子:

'(this list includes "text between quotation marks.")

在Lisp中,所有引号括起的内容,包括标点符号和空格,都会被视为一个单独的原子。这种类型的原子被称为字符串(string),通常用于让计算机打印出人类可读的消息。字符串与数字或符号不同,使用方式也有区别。