# 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对象的转换有时是单向的。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://emacs-lisp.ivory.cafe/lisp-shu-ju-lei-xing/2-lisp-shu-ju-lei-xing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
