Skip to content

Объявление переменных

В этой главе рассматривается основной синтаксис объявления переменных в YaoXiang. Если у вас есть опыт работы с другими языками программирования, вы обнаружите, что система переменных YaoXiang очень проста — все объявления используют единую синтаксическую модель.

Единая синтаксическая модель

Философия дизайна YaoXiang — «всё единообразно». Неважно, объявляете ли вы целое число, определяете функцию или создаёте тип — всё использует единый синтаксис:

name: type = value

Это ключевая концепция дизайна YaoXiang. Несколько примеров помогут понять эту согласованность:

yaoxiang
// Объявление переменной
x: Int = 42
name: String = "YaoXiang"

// Определение функции
add: (a: Int, b: Int) -> Int = a + b

// Определение типа
Point: Type = { x: Float, y: Float }

Синтаксическая форма объявления переменной:

('mut')? Identifier (':' TypeExpr)? '=' Expr

Человеческим языком: необязательное ключевое слово mut, затем имя переменной, затем необязательное : тип, и наконец = значение. Эта структура проходит через весь язык — учишь один раз и достаточно.

Неизменяемые переменные (поведение по умолчанию)

В YaoXiang все переменные неизменяемы по умолчанию. После присваивания значения изменить переменную нельзя. Это элемент безопасности языка.

yaoxiang
x = 10
// x = 20   // Ошибка компиляции! x неизменяем

При объявлении с помощью = компилятор ищет переменную с таким же именем во внешней области видимости. Если находит — присваивает ей значение; если не находит — создаёт новую неизменяемую переменную в текущей области видимости.

yaoxiang
x = 1       // Во внешней области видимости нет x, создаём новую переменную
x = 2       // Нашли внешний x, пытаемся присвоить → Ошибка компиляции! x неизменяем

Это может показаться неинтуитивным — если нашли переменную, почему нельзя присвоить? Всё потому, что YaoXiang ставит безопасность на первое место: неизменяемость по умолчанию означает, что вам не нужно беспокоиться о том, что какая-то переменная будет случайно изменена в каком-то уголке кода.

mut — изменяемые переменные

Когда действительно нужно изменить переменную, используйте ключевое слово mut для явного объявления:

yaoxiang
mut counter = 0
counter = counter + 1   // можно изменять
counter = 100           // тоже можно

У mut есть несколько важных правил:

Правило первое: mut — это явное создание новой переменной, компилятор не ищет одноимённую переменную во внешней области видимости.

yaoxiang
mut x = 10      // создаём новую изменяемую переменную x в текущей области
mut x = 20      // Ошибка компиляции! x уже объявлена в этой области

Правило второе: переменная, объявленная с mut, не может иметь то же имя, что и переменная во внешней области видимости (запрет затенения).

yaoxiang
x = 10
{
    mut x = 20   // Ошибка компиляции! x уже объявлена во внешней области, затенение запрещено
}

Правило третье: в одной области видимости каждое имя можно объявить только один раз — независимо от того, используете вы = или mut.

yaoxiang
x = 10
mut x = 20   // Ошибка компиляции! x уже объявлена

Эти правила гарантируют, что каждое имя переменной уникально в текущей области видимости, и вы никогда не столкнётесь с путаницей о том, какая именно переменная имеется в виду.

Вывод типов и явные аннотации типов

YaoXiang использует алгоритм вывода типов Хиндли-Милнера (HM). Компилятор может автоматически определить тип по записанному значению, и в большинстве случаев не нужно указывать тип вручную.

yaoxiang
x = 42              // Компилятор выводит Int
name = "YaoXiang"   // Выводит String
pi = 3.14159        // Выводит Float
is_valid = true     // Выводит Bool

Когда вы хотите явно указать тип (например, для улучшения читаемости кода или когда компилятор не может вывести тип), используйте синтаксис : Type:

yaoxiang
count: Int = 100
greeting: String = "Hello"
ratio: Float = 0.618

Оба варианта полностью эквивалентны. Можно начинать писать код без типов и добавлять аннотации по мере необходимости. Это ускоряет прототипирование, но не снижает уровень типобезопасности в итоговом коде.

Обзор базовых типов

В YaoXiang встроено несколько базовых типов, покрывающих подавляющее большинство повседневных сценариев программирования.

Int (целые числа)

yaoxiang
a = 42              // Десятичная система
b = 0o52            // Восьмеричная система (префикс 0o)
c = 0x2A            // Шестнадцатеричная система (префикс 0x)
d = 0b101010        // Двоичная система (префикс 0b)
e = 1_000_000       // Можно использовать подчёркивания для удобства чтения

Float (числа с плавающей точкой)

yaoxiang
pi = 3.14159
speed = 2.998e8         // Научная нотация: 2.998 × 10^8
tiny = 1.6e-19

String (строки)

yaoxiang
name = "YaoXiang"
empty = ""              // Пустая строка
escape = "Hello\nWorld" // Поддержка экранирования: \n перевод строки, \t табуляция, \\ обратная косая, \" кавычки
unicode = "\u{4F60}\u{597D}"  // Unicode-экранирование

Bool (логический тип)

yaoxiang
is_ready = true
is_done = false

Логические значения обычно используются в условных конструкциях:

yaoxiang
if is_ready {
    print("Начинаем обработку")
}

Область видимости переменных

Область видимости определяет, где переменная доступна. Правила области видимости в YaoXiang очень просты: каждый блок {} создаёт новую область видимости.

Основные правила

yaoxiang
{
    x = 10
    print(x)   // Доступно: x в текущей области видимости
}
// print(x)    // Ошибка: x за пределами области видимости

Внутренняя область видимости имеет доступ к переменным из внешней:

yaoxiang
outer = "Я снаружи"
{
    print(outer)   // Доступен outer из внешней области
    inner = "Я внутри"
}
// print(inner)    // Ошибка: inner за пределами области видимости

Область видимости параметров функций

yaoxiang
greet: (name: String) -> Void = {
    print("Привет, " + name)
    // name видим внутри этого тела функции
}
// name невидим за пределами функции

Блок как выражение

Блоки {} в YaoXiang также являются выражениями и могут возвращать значения:

yaoxiang
result = {
    x = 10
    y = 20
    return x + y   // Возвращает 30 в вызывающую область
}
// result равен 30
// x и y невидимы за пределами блока

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

Итоги

Вы освоили ключевые концепции системы переменных YaoXiang:

КонцепцияСуть
Единая модельname: type = value — для переменных, функций, типов
НеизменяемостьПосле x = 10 переменная x не может быть изменена
ИзменяемостьИспользуйте mut для явного объявления mut x = 10
Запрет затененияОдно имя в одной области можно объявить только один раз
Вывод типовАлгоритм HM автоматически выводит тип, можно : Type
Область видимостиКаждый {} создаёт область, внутренняя видит внешнюю

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