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”)