Объявление переменных
В этой главе рассматривается основной синтаксис объявления переменных в YaoXiang. Если у вас есть опыт работы с другими языками программирования, вы обнаружите, что система переменных YaoXiang очень проста — все объявления используют единую синтаксическую модель.
Единая синтаксическая модель
Философия дизайна YaoXiang — «всё единообразно». Неважно, объявляете ли вы целое число, определяете функцию или создаёте тип — всё использует единый синтаксис:
name: type = valueЭто ключевая концепция дизайна 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 все переменные неизменяемы по умолчанию. После присваивания значения изменить переменную нельзя. Это элемент безопасности языка.
x = 10
// x = 20 // Ошибка компиляции! x неизменяемПри объявлении с помощью = компилятор ищет переменную с таким же именем во внешней области видимости. Если находит — присваивает ей значение; если не находит — создаёт новую неизменяемую переменную в текущей области видимости.
x = 1 // Во внешней области видимости нет x, создаём новую переменную
x = 2 // Нашли внешний x, пытаемся присвоить → Ошибка компиляции! x неизменяемЭто может показаться неинтуитивным — если нашли переменную, почему нельзя присвоить? Всё потому, что YaoXiang ставит безопасность на первое место: неизменяемость по умолчанию означает, что вам не нужно беспокоиться о том, что какая-то переменная будет случайно изменена в каком-то уголке кода.
mut — изменяемые переменные
Когда действительно нужно изменить переменную, используйте ключевое слово mut для явного объявления:
mut counter = 0
counter = counter + 1 // можно изменять
counter = 100 // тоже можноУ mut есть несколько важных правил:
Правило первое: mut — это явное создание новой переменной, компилятор не ищет одноимённую переменную во внешней области видимости.
mut x = 10 // создаём новую изменяемую переменную x в текущей области
mut x = 20 // Ошибка компиляции! x уже объявлена в этой областиПравило второе: переменная, объявленная с mut, не может иметь то же имя, что и переменная во внешней области видимости (запрет затенения).
x = 10
{
mut x = 20 // Ошибка компиляции! x уже объявлена во внешней области, затенение запрещено
}Правило третье: в одной области видимости каждое имя можно объявить только один раз — независимо от того, используете вы = или mut.
x = 10
mut x = 20 // Ошибка компиляции! x уже объявленаЭти правила гарантируют, что каждое имя переменной уникально в текущей области видимости, и вы никогда не столкнётесь с путаницей о том, какая именно переменная имеется в виду.
Вывод типов и явные аннотации типов
YaoXiang использует алгоритм вывода типов Хиндли-Милнера (HM). Компилятор может автоматически определить тип по записанному значению, и в большинстве случаев не нужно указывать тип вручную.
x = 42 // Компилятор выводит Int
name = "YaoXiang" // Выводит String
pi = 3.14159 // Выводит Float
is_valid = true // Выводит BoolКогда вы хотите явно указать тип (например, для улучшения читаемости кода или когда компилятор не может вывести тип), используйте синтаксис : Type:
count: Int = 100
greeting: String = "Hello"
ratio: Float = 0.618Оба варианта полностью эквивалентны. Можно начинать писать код без типов и добавлять аннотации по мере необходимости. Это ускоряет прототипирование, но не снижает уровень типобезопасности в итоговом коде.
Обзор базовых типов
В YaoXiang встроено несколько базовых типов, покрывающих подавляющее большинство повседневных сценариев программирования.
Int (целые числа)
a = 42 // Десятичная система
b = 0o52 // Восьмеричная система (префикс 0o)
c = 0x2A // Шестнадцатеричная система (префикс 0x)
d = 0b101010 // Двоичная система (префикс 0b)
e = 1_000_000 // Можно использовать подчёркивания для удобства чтенияFloat (числа с плавающей точкой)
pi = 3.14159
speed = 2.998e8 // Научная нотация: 2.998 × 10^8
tiny = 1.6e-19String (строки)
name = "YaoXiang"
empty = "" // Пустая строка
escape = "Hello\nWorld" // Поддержка экранирования: \n перевод строки, \t табуляция, \\ обратная косая, \" кавычки
unicode = "\u{4F60}\u{597D}" // Unicode-экранированиеBool (логический тип)
is_ready = true
is_done = falseЛогические значения обычно используются в условных конструкциях:
if is_ready {
print("Начинаем обработку")
}Область видимости переменных
Область видимости определяет, где переменная доступна. Правила области видимости в YaoXiang очень просты: каждый блок {} создаёт новую область видимости.
Основные правила
{
x = 10
print(x) // Доступно: x в текущей области видимости
}
// print(x) // Ошибка: x за пределами области видимостиВнутренняя область видимости имеет доступ к переменным из внешней:
outer = "Я снаружи"
{
print(outer) // Доступен outer из внешней области
inner = "Я внутри"
}
// print(inner) // Ошибка: inner за пределами области видимостиОбласть видимости параметров функций
greet: (name: String) -> Void = {
print("Привет, " + name)
// name видим внутри этого тела функции
}
// name невидим за пределами функцииБлок как выражение
Блоки {} в 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 |
| Область видимости | Каждый {} создаёт область, внутренняя видит внешнюю |
Далее вы можете изучить подробнее базовые типы или перейти сразу к главе управление потоком выполнения.
