Переменные
Объявление с явным типом — тип имя = значение;:
целое возраст = 25;
текст имя = "Иван";
верно активен = да;
Вывод типа (имя = значение;)
Тип слева можно опустить целиком — если имя ещё не объявлено в этой
области видимости, имя = значение; — это ОБЪЯВЛЕНИЕ, а не присваивание,
и тип выводится из выражения справа:
возраст = 25; // выведено: целое
имя = "Иван"; // выведено: текст
итог = удвоить(21); // выведено из типа возврата функции
точка = Точка(3, 4); // выведено: Точка (вызов конструктора структуры)
Работает для любого выражения, тип которого семантический анализ может
определить напрямую (числовые и строковые литералы, да/нет, вызовы
функций и методов, конструкторы структур, арифметика и т. д.) — то есть
для подавляющего большинства реальных объявлений. Никакого отдельного
синтаксиса (вроде :=) не требуется — используется тот же оператор =,
что и у присваивания; различает их семантический анализ по тому, было ли
имя уже объявлено в текущей области видимости (см. grammar.md, раздел
4, и ast::Оператор::Присваивание — узел с этим именем на самом деле
неоднозначен и разрешается именно так).
⚠️ Ограничения:
Список из T/Словарь из Ключ и Значениечерез вывод типа объявить нельзя
— у них всегда только один типовый параметр в грамматике, конкретный
Т для пустого литерала-контейнера вывести неоткуда; указывай тип
явно (Список из целых числа = Список из целых();).
неизменнотребует явного типа (неизменно целое максимум = 100;) —
вывод типа с неизменно не комбинируется в этой версии.
- Если выражение справа настолько сложное, что тип не определяется
напрямую — честная ошибка компиляции ("не удалось вывести тип для '...' — выражение справа слишком сложное для текущей версии анализатора"), а не молчаливое падение к какому-то типу по умолчанию.
Неизменяемые переменные
Ключевое слово неизменно перед типом запрещает переприсваивание:
неизменно целое максимум = 100;
Явные приведения типов
Синтаксис — имя типа как функция: целое32(значение), дробное(значение).
⚠️ Важно: приведение нужно даже при инициализации **числовым литералом** — типы разной разрядности не смешиваются неявно нигде:
целое32 а = целое32(5); // так, не "целое32 а = 5;"
целое итог = целое(а) + б; // и здесь тоже явно