Изменчивость в Tolk по сравнению с функциями тильда в FunC
warning
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
TLDR
- нет методов тильда
~
cs.loadInt(32)
изменяет срез и возвращает целое числоb.storeInt(x, 32)
изменяет конструкторb = b.storeInt()
также работает, поскольку он не только изменяет, но и возвращает- связанные методы работают аналогично JS, они возвращают
self
- все работает точно так же, как и ожидалось, похоже на JS
- нет накладных расходов на выполнение, точно такие же инструкции Fift
- пользовательские методы создаются легко
- тильда "~" вообще не существует в Tolk
Это радикальное изменение. Если в FunC есть .methods()
и ~methods()
, то в Tolk есть только точка, единственный способ вызвать .method()
. Метод может изменить объект, а может и нет. В отличие от "короткого" списка, это поведенческое и семантическое отличие от FunC.
Цель состоит в том, чтобы иметь вызовы, идентичные JS и другим языкам:
FunC | Tolk |
---|---|
int flags = cs~load_uint(32); | var flags = cs.loadUint(32); |
(cs, int flags) = cs.load_uint(32); | var flags = cs.loadUint(32); |
(slice cs2, int flags) = cs.load_uint(32); | var cs2 = cs; |
slice data = get_data() | val flag = getContractData() |
dict~udict_set(...); | dict.uDictSet(...); |
b~store_uint(x, 32); | b.storeInt(x, 32); |
b = b.store_int(x, 32); | b.storeInt(x, 32); |
b = b.store_int(x, 32) | b.storeInt(x, 32) |
Чтобы сделать это доступным, Tolk предлагает концепцию изменяемости, которая является обобщением того, что означает тильда в FunC.
По умолчанию все аргументы копируются по значению (идентично FunC)
fun someFn(x: int) {
x += 1;
}
var origX = 0;
someFn(origX); // origX remains 0
someFn(10); // ok, just int
origX.someFn(); // still allowed (but not recommended), origX remains 0