Переменные

Объявление с явным типом — тип имя = значение;:

целое возраст = 25;
текст имя = "Иван";
верно активен = да;

Вывод типа (имя = значение;)

Тип слева можно опустить целиком — если имя ещё не объявлено в этой области видимости, имя = значение; — это ОБЪЯВЛЕНИЕ, а не присваивание, и тип выводится из выражения справа:

возраст = 25;              // выведено: целое
имя = "Иван";               // выведено: текст
итог = удвоить(21);          // выведено из типа возврата функции
точка = Точка(3, 4);         // выведено: Точка (вызов конструктора структуры)

Работает для любого выражения, тип которого семантический анализ может определить напрямую (числовые и строковые литералы, да/нет, вызовы функций и методов, конструкторы структур, арифметика и т. д.) — то есть для подавляющего большинства реальных объявлений. Никакого отдельного синтаксиса (вроде :=) не требуется — используется тот же оператор =, что и у присваивания; различает их семантический анализ по тому, было ли имя уже объявлено в текущей области видимости (см. grammar.md, раздел 4, и ast::Оператор::Присваивание — узел с этим именем на самом деле неоднозначен и разрешается именно так).

⚠️ Ограничения:

  • Список из T/Словарь из Ключ и Значение через вывод типа объявить нельзя

— у них всегда только один типовый параметр в грамматике, конкретный Т для пустого литерала-контейнера вывести неоткуда; указывай тип явно (Список из целых числа = Список из целых();).

  • неизменно требует явного типа (неизменно целое максимум = 100;) —

вывод типа с неизменно не комбинируется в этой версии.

  • Если выражение справа настолько сложное, что тип не определяется

напрямую — честная ошибка компиляции ("не удалось вывести тип для '...' — выражение справа слишком сложное для текущей версии анализатора"), а не молчаливое падение к какому-то типу по умолчанию.

Неизменяемые переменные

Ключевое слово неизменно перед типом запрещает переприсваивание:

неизменно целое максимум = 100;

Явные приведения типов

Синтаксис — имя типа как функция: целое32(значение), дробное(значение).

⚠️ Важно: приведение нужно даже при инициализации **числовым литералом** — типы разной разрядности не смешиваются неявно нигде:

целое32 а = целое32(5);    // так, не "целое32 а = 5;"
целое итог = целое(а) + б;  // и здесь тоже явно