对象的 printed representation打印表示,是 Lisp 打印器(函数 prin1)为该对象生成的输出格式。每种数据类型都有唯一的打印表示。对象的 read syntax读入语法,是 Lisp 读取器(函数 read)对该对象所接受的输入格式。这一格式不一定唯一:很多对象都支持多种语法。See Lisp 对象的读取与打印。
在大多数情况下,一个对象的打印表示形式同时也是该对象的读取语法。不过,某些类型并没有对应的读取语法,因为在 Lisp 程序中把这类对象当作常量输入是没有意义的。这类对象会以 hash notation井号表示法 打印:由字符 ‘#<’ 开头,接着是一段描述性字符串(通常是类型名后跟对象名),最后以 ‘>’ 结尾。(之所以称为 “hash natation井号表示法”,是因为它以字符 ‘#’ 开头,该字符也叫 “hash井号” 或 “数字符号”。)例如:
(current-buffer)
⇒ #<buffer objects.texi>
井号表示法完全无法被读取,因此 Lisp 读取器只要遇到 ‘#<’,就会报 invalid-read-syntax(非法读入语法)错误。
在本章后续各节中,我们会在介绍每种 Lisp 数据类型时,同时说明它的读取语法与打印表示形式。例如, 查看 字符串类型 及其子小节可了解字符串的读取语法与打印表示;查看 向量类型 可获取向量的相关信息,依此类推。
在其他语言中,表达式就是文本,没有别的形态。而在 Lisp 中,表达式首先是一个 Lisp 对象,其次才是作为该对象读入语法的文本。通常不必刻意强调这一区别,但你必须心里有数,否则偶尔会非常困惑。
当你交互式求值一个表达式时,Lisp 解释器会先读取它的文本表示,构造出一个 Lisp 对象,然后再对这个对象求值(see Evaluation)。但读取与求值是两个独立的过程:读取只是根据文本返回对应的 Lisp 对象;这个对象之后可能被求值,也可能不会。关于基本读取函数 read 的说明,See 输入函数。