Keyword syntax (DSL)

Особенности ассоциативной памяти

Синтаксис языка TrustLang основан на строгих правилах без использования ключевых слов, и как бы он не выглядел логичным, ассоциация по ключевым словам вспоминается гораздо легче, например if, чем комбинация минус минус правая угловая скобка –>. Из-за этого имеет смысл использовать не “чистый” базовый синтаксис, а более привычный диалект с использованием ключевых слов.

TrustLang уже содержит набор макросов, которые расширяют базовый синтаксис TrustLang, основанный на правилах, набором предопределенных ключевых слов как в классических языках программирования, которые можно адаптировать или дополнить под собственную предметную область.

Константы

  • @true - 1
  • @yes - 1
  • @false - 0
  • @no - 0

⚠️ НЕ РЕАЛИЗОВАНО: макросы @this/@self/@super/@latter/@last не определены в текущем наборе DSL (в include/trust/dsl.src они закомментированы)

  • @this или @self - Текущий объект
  • @super - Родительский объект
  • @latter или @last- Результат выполенения последнего оператора Result of the last operation

Логические операторы

⚠️ НЕ РЕАЛИЗОВАНО: макросы @and/@or/@xor/@not не определены в текущем наборе DSL (закомментированы); вместо них используются операторы &&, ||, ^^ и приведение к Bool

  • @and - Логическое И
  • @or - Логическое ИЛИ
  • @xor - Логическое Исключающее ИЛИ
  • @not(value) - Логическое отрицание

Операторы

  • @if(…) - Первый условный оператор

  • @elif(…) - Второй и все последующие условные операторы

  • @else - Оператор иначе

  • @while(…) - Оператор цикла с предусловием

  • @dowhile(…) - Оператор цикла с постусловием

  • @loop - Оператор безконечного цикла

  • @break [метка] - Выход из ближайшего цикла или из именованного блока метка (один идентификатор, без ::). Без метки: @break;

  • @continue [метка] - Переход на начало ближайшего цикла или именованного блока метка (один идентификатор, без ::). Без метки: @continue;

  • @return [значение] - Выход из текущей функции (аналог break по имени функции @__FUNCTION__). Void-форма: @return;. Со значением: @return <значение>; (один rvalue: имя, литерал, строка, вызов или словарь (a, b,) в скобках)

  • @throw( error ) - Оператор создания исключения и возврата ошибки

⚠️ НЕ РЕАЛИЗОВАНО: макрос @throw не реализован (вызов 'undefined name @throw'); механизм исключений в текущей версии не реализован

  • @match( … ) - Оператор оценки выражения
  • @case( … ) - Оператор сравнения с образцом
  • @default - Оператор выбора по улочанию

⚠️ НЕ РЕАЛИЗОВАНО: макросы @iter/@next/@curr/@first/@all не реализованы (вызов даёт 'undefined name'); протокол итераторов через '?' и '!' не реализован. Обходной путь: цикл @while(коллекция) с деструктуризацией (см. playground/foreach.src)

  • @iter(obj, … ) - Создание итератора
  • @next(obj, … ) - Получить следующий элемент итератора
  • @curr(obj, … ) - Получить текущий элемент итератора
  • @first(obj) - Перейти на первый элемент итератора
  • @all(obj) - Получить сразу все элементы итератора

⚠️ НЕ РЕАЛИЗОВАНО: макросы @exit/@abort/@using не реализованы в текущем наборе DSL (закомментированы/отсутствуют)

  • @exit(code) - Завершить выполнение программы и вернуть код завершения

  • @abort() - Прервать выполнение программы без сброса буферов на диск

  • @using(…) - Использовать перечисленные пространства имен при name lookup

Встроенные функции и проверки

⚠️ НЕ РЕАЛИЗОВАНО: в текущей версии нет встроенной функции print(fmt, ...); вывод реализован макросом @print(fmt, args...) → trust::trust__print__. Нативные srand/rand подключаются через @extern/@forward (см. playground/native_functions.src)

  • print(format:FmtChar, …):Int32 - Аналог С/С++ функции printf

  • srand(init:Int32):None - Задать начальное значение для генератору псевдослучайных чисел

  • rand():Int32 - Получить псевдослучайное число

  • @static_assert( … ) - Вычислить выражение и проверить его на истинность во время компиляции

⚠️ НЕ РЕАЛИЗОВАНО: макрос @static_assert не реализован (вызов даёт 'undefined name')

  • @assert( … ) - Вычислить выражение и проверить его на истинность во время выполенения
  • @verify( … ) - Вычислить выражение и проверить его на истинность во время выполенения

Если запустить компилятор с флагом --nlc-no-assert, тогда рантайм проверки @assert удаляются из текста программы, а вычисления внутри @verify выполняются, но их результат игнорируется.

Предопределенные макросы

При работе парсера TrustLang автоматически формируются несколько зарезервированных макросов, часть из которых соответствуют макросам препроцессора у С/С++. Данные предопределенные макросы можно использовать как обычные константы.

⚠️ НЕ РЕАЛИЗОВАНО: предопределённые макросы в текущей версии требуют префикса '@' (@__FILE__, @__LINE__, @__COUNTER__ и т.д.), а имена версии компилятора переименованы из __NLC_* в __TRUST_VERSION*/__TRUST_GIT_HASH*/__TRUST_DATE_BUILD__ (см. Parser::RegisterPredefMacro в src/syntax/parser.cpp)

  • __FILE__ или __FILE_NAME__ - имя и полный путь текущего файла

  • __LINE__ или __FILE_LINE__ - содержит номер текущей строки в файле

  • __FILE_TIMESTAMP__ - дату и время последней модификации текущего файла в строковом представлении

  • __FILE_MD5__ - md5 хеш текущего файла в строковом виде

  • __COUNTER__ - целочисленный счетчик, который увеличивает свое значение при каждом обращении

  • __DATE__ - дата начала запуска компилятора (имеет одно и тоже значение для всех обрабатываемых файлов)

  • __TIME__ - время начала запуска компилятора (имеет одно и тоже значение для всех обрабатываемых файлов)

  • __TIMESTAMP__ - дату и время начала запуска компилятора (например: “Fri 19 Aug 13:32:58 2016”)

  • __TIMESTAMP_ISO__ - дату и время начала запуска компилятора в формате ISO (например: “2013-07-06T00:50:06Z”)

  • __NLC_VER__ - Страшая и младшая версия компилятора TrustLang (8 битное число, по 4 бита на цифру)

  • __NLC_DATE_BUILD__ - текстовая строка с датой сборки компилятора TrustLang (например, “23.06.04 20:51:39”)

  • __NLC_SOURCE_GIT__ - текстовая строка с идентификатором исходных файлов TrustLang git репозитория, использованных при сборке компилятора (например, “v0.3.0-fef8c371”)

  • __NLC_SOURCE_BUILD__ - дата сборки и git идентификатор исходных файлов TrustLang одной текстовой строкой (например, “v0.3.0-fef8c371 23.06.04 20:51:39”)