2 2 Объявления переменной

### Объявление

Переменные объявляются выражением let.

let /*модификатор константности*/ x;

Изменяемость

Свойство изменяемости можно указывать явно.

let mut x; // подлежит изменению

let const y = 10; // не подлежит изменению

let z;       // компилятор сам разберётся как рабоать с переменной
let const::auto k;  // то же самое но явно

Есть специальные квалификаторы изменяемости.

let const::ct x = 10;

const::ct значит что неизменяемость не может быть изменена в будущем через каст типа (а значит компилятор оптимизирует её).

let const::rt y = 10;

const::rt значит что неизменяемость может являться условной. А значит вполне возможно будет можно убрать этот квалификатор. Компилятор не будет оптимизировать.

let const::full z = 10;

const::full значит, что неизменяемость будет comiple time. Неизменяемость будет принимать только значение литерала. Выведение значения из функции не допускается. Компилятор будет агрессивно оптимизировать эту переменную, в плоть до того, что вставлять её значение в точках вызова функции. Можно применять к параметрам функции, только если есть дефолтное значение которое никогда не меняется.

let const::expr s = 10;

const::expr значит, что переменную можно вывести через вызов функции или выражения в compile time.

let mut x = 10;

mut значит это обычная переменная, которая подлежит изменению.

let mut::atomic::write y = 10;

mut::atomic Значит что для записи будет использованы атомарные операции.

let mut::atomic::full y = 10;

mut::atomic::full Значит что для чтения и записи будут использованы атомарные операции.

Задание типа

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

Литералы

Значения переменных могут быть заданы по-разному. Тип значения автоматически выводится из типа переменной. Все литералы по умолчанию находятся в суперпозиции, где нет конкретного типа, тип подберётся автоматически в соответствиями с требованиями переменной на основании лучшего результата.

Тип значения целых чисел числится как bignum и может содержать большое число, больше чем можно
представить в виде реального значения.

Постфиксы

Постфиксы идут после числа или строки и определяют тип значения. Например:

let mut k = 10i;

Данный код определяет переменную k и инициализирует её целочисленным значением 10.

Постфиксы по знаку (целочисленные)

Постфикс Пример Тип
i 10i int
ui 10ui unsigned int
si -10si signed int
Постфиксы по размеру (целочисленные)
Постфикс Пример Размер
i8 10i8 byte
i16 665i16 word
i32 10_000i32 dword
i64 1000_000_000i64 qword

Числа можно разделять знаками подчёркивания для удобства чтения. Пример:

let const x = 10_000_000;
let const hex = 0x00_6a_91_ff;

Дроби

Язык поддерживает запись значений через числитель/знаменатель. Такая запись приведётся к ближайшему дробному числу.

var : real a = (1/2)real;

Проверка существования

Для проверки существования используется оператор exist() в статичном выражении #if. 3 1 if Мы можем во время компиляции проверить существование переменной.

let a; // работает как флаг
#if(exist(a)) // if помечен # как constexpr
{
    let a : str = "hello";
}
else
{
    let a : float = 0.3;
}

println!(a);
// Напечатает hello