Scheme 编程/Scheme 数据类型
外观
Scheme 有几种数据类型,有原子类型和复合类型,两者之间最显著的区别是原子类型是唯一且不可变的,而复合类型是可变的,这意味着我们可以修改它们。 这也意味着,例如,可以有两个不同的字符串
"Hello, World!"
即使它们具有相同的字符,而每个字符
#\H
是同一个对象。
布尔值是
#t
(true) 或
#f
(false)。布尔值是自评估的。
数字是自评估的,并按预期输入。 Scheme 还支持复数,例如
0+4i
。只需键入
4i
在 Scheme 中被解释为一个符号,注意。
字符是自评估的,并按如下方式输入
#\a
.
符号是字符序列,不同于字符串,因为它们不是自评估的,并且它们也不能包含空格。 它们只是通过实际键入输入,例如
(add one two)
是 Scheme 中包含三个符号的列表。
对和列表是 Scheme 中最重要的复合类型。 我们已经说过 Scheme 源代码本身是由列表组成的,因此列表显然不是自评估的。 键入一个不能合理评估的列表(例如以数字开头的列表)将产生错误。
但是,有一个列表是原子的;它被称为空列表,或nil 或null,取决于你与谁交谈。 它只是一个根本没有元素的列表。 它在源代码中表示为
()
。所有其他列表实际上都是伪装的对,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."