Topazdocs
Политика языка

Связывания, области и замыкания

Каноническая грамматика, семантика, ограничения и отложенные границы: Связывания, области и замыкания.

Связывания явно задают mutability, compile-time вычисление, destructuring, lexical lifetime, shadowing и capture замыкания, а не выводят их из случайного присваивания.

Политика

let pattern = expression создаёт неизменяемые lexical bindings и допускает destructuring только для разрешённого pattern. let mut name = expression создаёт одну mutable cell только для bare identifier. const name = const-expression вычисляется ограниченной constant-грамматикой. Области lexical: внутренний блок может затенить внешнее имя, но повтор в той же области запрещён.

Определённое поведение

Неизменяемый capture остаётся read-only. Лямбда, захватившая mutable binding, видит ту же cell; допустимые присваивания сохраняются между вызовами, а cell живёт, пока нужна замыканию. Pattern bindings неизменяемы и ограничены успешной ветвью или итерацией. using name = fileExpression { body } создаёт один неизменяемый File в дочерней области и регистрирует implicit close после успешного acquisition.

Ограничения и явный отказ

mut let отклоняется; канонично только let mut. Нельзя присваивать immutable let, const, параметрам и pattern bindings. using принимает одно неаннотированное bare name и один проверенный File: без destructuring, нескольких ресурсов, mutable, as, общего close-протокола и значения выражения. Refutable pattern нельзя использовать в обычном let, если позиция не доказывает его irrefutable.

Отложенная граница

Явные capture lists, move capture, Rust closure traits, borrow receivers, общий disposable protocol, asynchronous cleanup и гарантии host exception после close находятся вне контракта. Замыкание сохраняет lexical Topaz cells, а не синтаксис владения целевого языка.

Пример

TOPAZ
function makeAdder(base: int) -> (int) -> int {
    return value => value + base
}

const DEFAULT_STEP = 5
let addStep = makeAdder(DEFAULT_STEP)
let mut total = 0
total = addStep(total)

Связанные правила