Перейти к основному содержимому

Сравнение Tolk и FunC: коротко

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

Tolk гораздо больше похож на TypeScript и Kotlin, чем на C и Lisp. Но он по-прежнему дает вам полный контроль над ассемблером TVM, поскольку внутри него есть ядро ​​FunC.

  1. Функции объявляются через fun, get-методы через get, переменные через varval для неизменяемых), типы указываются справа; типы параметров являются обязательными; возвращаемый тип может быть опущен (автоматически выводится), а также для локальных переменных; спецификаторы 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 { ... }
  1. Нет impure, это по умолчанию, компилятор не будет отбрасывать вызовы пользовательских функций
  2. Не recv_internal и recv_external, а onInternalMessage и onExternalMessage
  3. 2+2 это 4, а не идентификатор; идентификаторы буквенно-цифровые; используйте обозначение const OP_INCREASE вместо const op::increase
  4. Поддерживаются логические операторы AND &&, OR ||, NOT !
  5. Улучшения синтаксиса:
    • ;; comment// comment
    • {- comment -}/* comment */
    • #includeimport, со строгим правилом "импортируйте то, что используете"
    • ~ 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)
    • elseifelse if
    • ifnot (cond)if (!cond)
  6. Функцию можно вызывать, даже если она объявлена ​​ниже; предварительные объявления не нужны; компилятор сначала выполняет синтаксический анализ, а затем выполняет разрешение символов; теперь исходный код представлен в формате AST
  7. Функции stdlib переименованы в подробные понятные названия в стиле camelCase; теперь они встроены, а не загружены с GitHub; они разделены на несколько файлов; общие функции доступны всегда, более конкретные доступны с помощью import "@stdlib/tvm-dicts", IDE предложит вам; вот сопоставление
  8. Нет методов тильды ~; cs.loadInt(32) изменяет срез и возвращает целое число; b.storeInt(x, 32) изменяет конструктор; b = b.storeInt() также работает, так как он не только изменяет, но и возвращает; сцепленные методы работают идентично JS, они возвращают self; все работает точно так же, как и ожидалось, похоже на JS; нет накладных расходов во время выполнения, точно такие же инструкции Fift; пользовательские методы создаются легко; тильды ~ вообще нет в Tolk; подробнее здесь
  9. Понятные и читаемые сообщения об ошибках при несоответствии типов
  10. Поддержка типа bool

Инструментарий

Что делать дальше

Сравнение Tolk и FunC: в деталях