跳转到内容

Scheme 编程/Scheme 数据类型

来自维基教科书,开放的书籍,为开放的世界
Scheme 编程
 ← Scheme 简介 Scheme 数据类型 简单表达式 → 

Scheme 有几种数据类型,有原子类型和复合类型,两者之间最显著的区别是原子类型是唯一不可变的,而复合类型是可变的,这意味着我们可以修改它们。 这也意味着,例如,可以有两个不同的字符串

"Hello, World!"

即使它们具有相同的字符,而每个字符

#\H

是同一个对象。

原子类型

[编辑 | 编辑源代码]

布尔值

[编辑 | 编辑源代码]

布尔值是

#t

(true) 或

#f

(false)。布尔值是自评估的。

数字是自评估的,并按预期输入。 Scheme 还支持复数,例如

0+4i

。只需键入

4i

在 Scheme 中被解释为一个符号,注意。

字符是自评估的,并按如下方式输入

#\a

.

符号是字符序列,不同于字符串,因为它们不是自评估的,并且它们也不能包含空格。 它们只是通过实际键入输入,例如

(add one two)

是 Scheme 中包含三个符号的列表。

复合类型

[编辑 | 编辑源代码]

对和列表

[编辑 | 编辑源代码]

对和列表是 Scheme 中最重要的复合类型。 我们已经说过 Scheme 源代码本身是由列表组成的,因此列表显然不是自评估的。 键入一个不能合理评估的列表(例如以数字开头的列表)将产生错误。

但是,有一个列表是原子的;它被称为空列表,或nilnull,取决于你与谁交谈。 它只是一个根本没有元素的列表。 它在源代码中表示为

()

。所有其他列表实际上都是伪装的对,a 和 b 的一对写成

(a . b)

,这与 a 和 b 的列表不同。 对也不是自评估的,并且通常会产生错误。 列表是什么,只是一个对,它的第一个元素(也称为它的car)是列表的第一个元素,它的第二个元素(也称为它的cdr)是一个列表包含所有其他元素。 因此列表

(print "Hello, World!")

只是

(print . ("Hello, World!" . ()))

的简写

向量

[编辑 | 编辑源代码]

列表的问题是,如果列表非常大,list-ref 和 list-set! 是缓慢的操作。 为了使数据结构允许快速读取和写入,Scheme 提供了向量。

#(100 90 80 70)

这是一个数字向量的示例

字符串

[编辑 | 编辑源代码]

"This is a string."
字符串是字符序列。 它们包含在双引号中。
华夏公益教科书