Стандартная библиотека 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";
Распаковывает тройку.
tuple4
forall X, Y, Z, W -> [X, Y, Z, W] tuple4(X x, Y y, Z z, W w) asm "4 TUPLE";
Создает кортеж из 4 элементов.
untuple4
forall X, Y, Z, W -> (X, Y, Z, W) untuple4([X, Y, Z, W] t) asm "4 UNTUPLE";
Распаковывает кортеж из 4 эле ментов.
first
forall X -> X first(tuple t) asm "FIRST";
Возвращает первый элемент кортежа.
second
forall X -> X second(tuple t) asm "SECOND";
Возвращает второй элемент кортежа.
third
forall X -> X third(tuple t) asm "THIRD";
Возвращает третий элемент кортежа.
fourth
forall X -> X fourth(tuple t) asm "3 INDEX";
Возвращает четвертый элемент кортежа.
pair_first
forall X, Y -> X pair_first([X, Y] p) asm "FIRST";
Возвращает первый элемент пары.
pair_second
forall X, Y -> Y pair_second([X, Y] p) asm "SECOND";
Возвращает второй элемент пары.
triple_first
forall X, Y, Z -> X triple_first([X, Y, Z] p) asm "FIRST";
Возвращает первый элемент тройки.
triple_second
forall X, Y, Z -> Y triple_second([X, Y, Z] p) asm "SECOND";
Возвращает второй элемент тройки.
triple_third
forall X, Y, Z -> Z triple_third([X, Y, Z] p) asm "THIRD";
Возвращает третий элемент тройки.
Примитивы, специфичные для домена
Извлечение информации из c7
Некоторые пол езные сведения о вызове смарт-контракта можно найти в специальном регистре c7. Эти примитивы служат для удобного извлечения данных.
now
int now() asm "NOW";
Возвращает текущее время Unix как целое число
my_address
slice my_address() asm "MYADDR";
Возвращает внутренний адрес текущего смарт-контракта как срез с MsgAddressInt
. При необходимости его можно проанализировать далее с помощью примитивов, таких как parse_std_addr
.
get_balance
[int, cell] get_balance() asm "BALANCE";