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

最后更新于