> For the complete documentation index, see [llms.txt](https://emacs-lisp.ivory.cafe/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://emacs-lisp.ivory.cafe/lisp-shu-ju-lei-xing/2-lisp-shu-ju-lei-xing.md).

# 2 Lisp 数据类型

Lisp 对象 是指用于构建 Lisp 程序的一小段数据。在本小结中，类型(type)或数据类型(data type)是指一系列对象的封装集合。

每个对象都至少属于一种数据类型。相同类型的对象通常拥有相似的结构，拥有相似的功能。类型可以被覆盖，也就是说一个对象可以同时属于两种及以上的类型。因此，我们通常会问某个对象**属于**哪种类型，而不会说这个对象的类型**是**什么。（注意表述）

Emacs 中内建一些基础的数据类型。这些用于构造其他更复杂结构的类型称为原始类型(primitive types)。每个对象必定属于某一种原始类型。原始类型包含：整型，浮点型，点对，符号，字符串，向量，哈希表，子例程，字节码函数，记录，以及一些emacs中与编辑相关的特殊类型，比如缓冲区。（详见编辑类型）

每个原始类型都有一个对应的Lisp函数，用于检查某个对象是否属于该类型。

与大多数语言不同的是，Lisp是self-typing的：每个对象的原始类型隐含在该对象本身。例如，若一个对象是向量，那就不能将它当成数字进行处理；Lisp知晓该对象的原始类型是向量，而非数字。

在大多数语言中，程序员必须为每个变量进行类型声明，以便编译器处理，但这些类型并没有在数据内部体现出来。在Emacs Lisp中，不存在类似的类型声明。Lisp变量可以存储任何类型的值，同时它不仅记录了值，而且记录了类型以及其他所有信息。(实际上，Emacs Lisp中较小的数字通常只能属于某个特定的原始类型)

本章节介绍了GNU Emacs Lisp中每种标准化类型(standard types)的设计目的(purpose)、打印表示(printed representation)以及读取语法(read syntax)。细节会在后续的章节中介绍。

译者注：

上面用到了对象和变量两种表述，这是两个不同的概念，读者需要注意区分。Lisp中概念很多，切不可混淆。

上面的Lisp对象是一种表述，指某个“物体”。不要和面向对象类语言中的对象混淆，原始的Lisp中并没有继承、多态等特性，也没有原型继承，类继承这些概念。

Lisp中的变量与绝大多数语言中的变量都不太一样，Lisp中的变量通常都需要自求值，将代码表述(也就是上面的读取语法)转换为实际的Lisp对象，这一过程称为解释器的读取；而将Lisp对象的代码表述称为打印表示。这有点类似很多语言中的数据序列化，但是不完全相同：序列化通常是完全可逆的，但这里打印表示和Lisp对象的转换有时是单向的。
