FunC 标准库
信息
本节讨论了 stdlib.fc 库,它包含了在 FunC 中使用的标准函数。
目前,该库只是最常用的 TVM 命令的汇编器的包装,这些命令不是内置的。库中使用的每个 TVM 命令的描述都可以在 TVM 文档部分找到。本文档也借用了一些描述。
文件中的一些函数被注释掉了。这意味着它们已经成为了优化目的的内置函数。然而,类型签名和语义保持不变。
请注意,stdlib 中没有呈现一些不太常见的命令。总有一天它们也会被添加。
元组操作原语
名称和类型大多是自解释的。有关多态函数的更多信息,请参见 多态性与 forall。
请注意,目前原子类型 tuple
的值不能转换为复合元组类型(例如 [int, cell]
),反之亦然。
Lisp 类型列表
列表可以表示为嵌套的 2 元组。空列表通常表示为 TVM null
值(可以通过调用 null()
获得)。例如,元组 (1, (2, (3, null)))
表示列表 [1, 2, 3]
。列表的元素可以是不同类型。
cons
forall X -> tuple cons(X head, tuple tail) asm "CONS";
在 Lisp 类型列表的开头添加一个元素。
uncons
forall X -> (X, tuple) uncons(tuple list) asm "UNCONS";
提取 Lisp 类型列表的头和尾。
list_next
forall X -> (tuple, X) list_next(tuple list) asm( -> 1 0) "UNCONS";
提取 Lisp 类型列表的头和尾。可用作 (非)修改方法。
() foo(tuple xs) {
(_, int x) = xs.list_next(); ;; 获取第一个元素,`_` 表示不使用尾列表
int y = xs~list_next(); ;; 弹出第一个元素
int z = xs~list_next(); ;; 弹出第二个元素
}