Sec 1.2.5 真和假
在 Scheme 中,布尔类型的值真和假分别用 #t 和 #f 表示。但是,出于条件检测的目的,任何 Scheme 值都可以被看作一个布尔值。本手册使用词 “真” 表示记为真的 Scheme 值,使用词 “假” 表示记为假的 Scheme 值。在条件检测中,除了 #f 外,所有的值记为真(参见 Sec 2.7 [ 条件 ],第26页)。
Sec 1.2.6 外部表示
在 Scheme 中一个重要的概念是对象作为字符序列的外部表示。例如,整数 28 的外部表示为字符序列 ‘28’,由整数 8 和 13 构成的列表的外部表示为字符序列 '(8 13)'。
对象的外部表示不一定是唯一的。整数 28 也可以表示为 '#e28.000' 和 ‘#x1c',之前提到的列表也可以表示为 '( 08 13 )' 和 '(8 . (13 . ( )))'。
许多对象有标准的外部表示,但是有一些,例如过程和循环数据结构并没有标准表示(尽管特定实现可能会为他们定义表示)。
可以在程序中编写外部表示,以获得相应的对象(参见 Sec 2.6 [ 引用 ],第 24 页 )。
外部表示也可用于输入输出。过程 read 解析外部表示,过程 write 生成外部表示。它们一起提供了一个优雅而强大的输入/输出功能。
请注意,字符串 '(+ 2 6)' 不是整数 8 的外部表示,尽管它是一个计算结果为 8 的表达式;但是,它是一个三元列表的外部表示,其元素为符号 +、整数 2 和 6。Scheme 语法具有这样的特性:作为表达式的任何字符序列也是某个对象的外部表示。这可能会导致混淆,因为在上下文之外,一个给定的字符序列是否用于表示数据或程序可能并不明显,但它也是一种力量的来源,因为它有助于编写例如将程序视为数据或将数据视为程序的解释器和编译器之类的程序。
Sec 1.2.7 类型不相交
每个对象最多满足以下一个谓词(但请参见 Sec 1.2.5 第8页 [ True 和 False ],以了解例外情况):
bit-string? | environment? | port? | symbol? |
boolean? | null? | procedure? | vector? |
cell? | number? | promise? | weak-pair? |
char? | pair? | string? | |
condition? |
Sec 1.2.8 存储模型
本节介绍一个模型,用于理解 Scheme 对存储的使用。
变量和对象(例如序对、向量和字符串)隐式表示位置或位置序列。例如,字符串的位置数与字符串中的字符数量相同。( 这些位置不需要对应完整的机器字。)一个新的值有可以通过过程 string-set!被存储到这些位置中的某一个位置,但字符串仍然表示与前面相同的位置。
通过变量引用或过程(如 car、vector ref 或 string ref )从某个位置获取的对象在 eqv?的意义上讲是等价于获取前最后一次存储在该位置的对象。
每个位置都有标记,以显示是否正在使用。任何变量或对象都不会引用未使用的位置。每当本文档提到为变量或对象分配存储时,其含义是从未使用的位置集中选择适当数量的位置,并在它们表示变量或对象之前先标记所选位置,以表示这些位置正在被使用。
在许多系统中,希望常量(即文字表达式的值)驻留在只读存储器中。为了表示这一点,可以很方便地设想,每个表示位置的对象都与一个标志相关联,该标志指示该对象是可变的还是不可变的。常数和字符串通过返回 symbol->string 来表示是不可变量,而其他过程创建的所有对象都是可变的。尝试将新值存储到由不可变对象表示的位置是错误的。请注意,MIT/GNU Scheme 编译器利用此属性共享常量,但这些常量不是不可变的。而是 equal?相等的常数可能在编译代码中 eq?。