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(); ;; get the first element, `_` means do not use tail list
int y = xs~list_next(); ;; pop the first element
int z = xs~list_next(); ;; pop the second element
}
car
forall X -> X car(tuple list) asm "CAR";
返回 Lisp 类型列表的头部。
cdr
tuple cdr(tuple list) asm "CDR";
返回 Lisp 类型列表的尾部。
其他元组原语
empty_tuple
tuple empty_tuple() asm "NIL";
创建 0 元素元组。
tpush
forall X -> tuple tpush(tuple t, X value) asm "TPUSH";
forall X -> (tuple, ()) ~tpush(tuple t, X value) asm "TPUSH";
将值 x
追加到 Tuple t = (x1, ..., xn)
,但只有在结果 Tuple t' = (x1, ..., xn, x)
不超过 255 个字符时才有效。否则,会抛出类型检查异常。
single
forall X -> [X] single(X x) asm "SINGLE";
创建单例,即长度为一的元组。
unsingle
forall X -> X unsingle([X] t) asm "UNSINGLE";
解包单例。
pair
forall X, Y -> [X, Y] pair(X x, Y y) asm "PAIR";
创建一对。
unpair
forall X, Y -> (X, Y) unpair([X, Y] t) asm "UNPAIR";
解包一对。
triple
forall X, Y, Z -> [X, Y, Z] triple(X x, Y y, Z z) asm "TRIPLE";