Сравнение Tolk и FunC: коротко
warning
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Tolk гораздо больше похож на TypeScript и Kotlin, чем на C и Lisp. Но он по-прежнему дает вам полный контроль над ассемблером TVM, поскольку внутри него есть ядро FunC.
- Функции объявляются через
fun
, get-методы черезget
, переменные черезvar
(иval
для неизменяемых), типы указываются справа; типы параметров являются обязательными; возвращаемый тип может быть опущен (автоматически выводится), а также для локальных переменных; спецификаторыinline
и другие являются атрибутами@
global storedV: int;
fun parseData(cs: slice): cell {
var flags: int = cs.loadMessageFlags();
...
}
@inline
fun sum(a: int, b: int) { // auto inferred int
val both = a + b; // same
return both;
}
get currentCounter(): int { ... }
- Нет
impure
, это по умолчанию, компилятор не будет отбрасывать вызовы пользовательских функций - Не
recv_internal
иrecv_external
, аonInternalMessage
иonExternalMessage
2+2
это 4, а не идентификатор; идентификаторы буквенно-цифровые; используйте обозначениеconst OP_INCREASE
вместоconst op::increase
- Поддерживаются логические операторы AND
&&
, OR||
, NOT!
- Улучшения синтаксиса:
;; comment
→// comment
{- comment -}
→/* comment */
#include
→import
, со строгим правилом "импортируйте то, что используете"~ found
→!found
(только для true/false, очевидно) (true равно -1, как в FunC)v = null()
→v = null
null?(v)
→v == null
, то же самое дляbuilder_null?
и других~ null?(v)
→c != null
throw(excNo)
→throw excNo
catch(_, _)
→catch
catch(_, excNo)
→catch(excNo)
throw_unless(excNo, cond)
→assert(cond, excNo)
throw_if(excNo, cond)
→assert(!cond, excNo)
return ()
→return
do ... until (cond)
→do ... while (!cond)
elseif
→else if
ifnot (cond)
→if (!cond)
- Функцию можно вызывать, даже если она объявлена ниже; предварительные объявления не нужны; компилятор сначала выполняет синтаксический анализ, а з атем выполняет разрешение символов; теперь исходный код представлен в формате AST
- Функции stdlib переименованы в
подробныепонятные названия в стиле camelCase; теперь они встроены, а не загружены с GitHub; они разделены на несколько файлов; общие функции доступны всегда, более конкретные доступны с помощьюimport "@stdlib/tvm-dicts"
, IDE предложит вам; вот сопоставление - Нет методов тильды
~
;cs.loadInt(32)
изменяет срез и возвращает целое число;b.storeInt(x, 32)
изменяет конструктор;b = b.storeInt()
также работает, так как он не только изменяет, но и возвращает; сцепленные методы работают идентично JS, они возвращаютself
; все работает точно так же, как и ожидалось, похоже на JS; нет накладных расходов во время выполнения, точно такие же инструкции Fift; пользовательские методы создаются легко; тильды~
вообще нет в Tolk; подробнее здесь - Понятные и читаемые сообщения об ошибках при несоответствии типов
- Поддержка типа
bool
Инструментарий
- Существует плагин JetBrains
- Расширение VS Code существует
- Обертка WASM для blueprint существует
- И даже конвертер из FunC в Tolk существует