英文文档原地址: https://book.clarity-lang.org/ch02-02-sequence-types.html
序列
顾名思义,Sequences 序列保存数据序列。Clarity 提供了三种不同类型的序列:缓冲区、字符串和列表。
缓冲区
Buffers 是固定最大长度的非结构化数据。它们总是以前缀 0x 开头,后跟一个十六进制字符串。因此,每个字节由两个所谓的十六进制表示。
0x68656c6c6f21
上面的缓冲区意思是“你好!”。 (将其复制并粘贴到此页面以进行验证。)
字符串
String 是一个字符序列。这些可以定义为 ASCII 编码字符串或 UTF-8 编码字符串。ASCII 字符串可能只包含基本的拉丁字符,而 UTF-8 字符串可以包含有趣的东西,比如表情符号。两种字符串类型都用双引号 (") 括起来,但 UTF-8 字符串也以 u 为前缀。就像缓冲区一样,字符串在 Clarity 中始终具有固定的最大长度。
ASCII 编码:
"This is an ASCII string"
UTF-8 编码:
u"And this is an UTF-8 string \u{1f601}"
您可以使用字符串来传递名称和消息。
列表
Lists 列表是包含另一种类型的具有固定长度的序列。由于类型不能混合,一个列表只能包含相同类型的项目。以这个有符号整数列表为例:
(list 4 8 15 16 23 42)
如您所见,列表是使用 list 函数构造的。这是一个 ASCII 字符串列表:
(list "Hello" "World" "!")
为了完整起见,下面的示例是一个由于混合类型而无效的列表:
(list u5 10 "hello") ;; This list is invalid.
列表非常有用,可以更轻松地执行批量操作。 (例如,将一些代币发送到一个列表中的一些用户。)您可以使用 map 或 fold 函数迭代列表。
map 对每个元素执行一个输入函数,并返回一个包含更新值的新列表。not 函数反转布尔值( true 变为 false,false 变为 true )。因此,我们可以像这样反转布尔值列表:
(map not (list true true false false))
fold 将输入函数应用于列表的每个元素和前一个应用程序的输出值。它还需要一个初始值用于第一个元素的第二个输入。返回的结果是最终应用程序返回的最后一个值。此函数通常也称为 reduce,因为它将列表缩减为单个值。我们可以使用 fold 通过应用初始值为 u0 的 +(加法)函数来对列表中的数字求和:
(fold + (list u1 u2 u3) u0)
上面的代码段可以扩展为以下内容:
(+ u3 (+ u2 (+ u1 u0)))
使用序列
长度
序列总是有一个特定的长度,我们可以使用 len 函数检索它。
缓冲区示例(请记住,每个字节表示为两个十六进制):
(len 0x68656c6c6f21)
字符串示例
(len "How long is this string?")
列表示例
(len (list 4 8 15 16 23 42))
检索元素
它们还允许您提取特定索引处的元素。下面从列表中取出第四个元素。 (从 0 开始计数。)
(element-at (list 4 8 15 16 23 42) u3)
您也可以反向操作并在序列中查找特定项目的索引。我们可以搜索列表以查看它是否包含值 23 。
(index-of (list 4 8 15 16 23 42) 23)
我们得到的结果是( some u4 ),表明在索引 4 这个位置的值为 23 。细心的人现在可能想知道,这个“some”是什么?请继续阅读,所有内容将在下一节中揭晓。