Стандартная библиотека FunC
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
В этом разделе обсуждается библиотека 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";
Создает тройку.
untriple
forall X, Y, Z -> (X, Y, Z) untriple([X, Y, Z] t) asm "UNTRIPLE";