Сравнение 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 = nullnull?(v)→v == null, то же самое дляbuilder_null?и других~ null?(v)→c != nullthrow(excNo)→throw excNocatch(_, _)→catchcatch(_, excNo)→catch(excNo)throw_unless(excNo, cond)→assert(cond, excNo)throw_if(excNo, cond)→assert(!cond, excNo)return ()→returndo ... until (cond)→do ... while (!cond)elseif→else ififnot (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 существует