Разновидности
- Обычное
var := expr
— только устанавливает значение переменной - Завершающее
var = expr
— устанавливает значение и маркирует конец возможности изменения переменной ниже по тексту в тех же ветках кода, учитывая вложенность. - Обмен
var1 <-> var2
— взаимный обмен переменных значениями - Передающее
var1 <- var2
— подразумевает, что правая переменная теряет значение - Лишение значения
X var
— обозначение, что переменная утратила значение
Внутриструктурность присваивания — var.{a := b}
. Аналогично var.a := var.b
за исключением того, что позволяет удостоверять сохранение полноты графа. Внутриструктурность неприменима только к лишению значения.
proc go(x, y int) (ok bool) {
var (last bool)
ok := check(x);
if (ok)
do /* последнее присваивание только текстуально,
но не обязательно во времени, особенно в циклах */
ok = nextDo(<>x, >last)
while (~last);
// ok = true // ошибка, ok
уже зафиксирована в цикле выше
else
// позволена, ведь фиксация ok
была выше, но в другой ветке
ok := tryOther(y)
end;
//ok = true // ошибка, даже если выполнилась else с обычным присваиванием
}
Обменные и передающие присваивания важны в коде, где необходимо соблюдать баланс значений, что характерно для некоторых указателей, включая контекст владения. Утрата значения используется для дополнительной диагностики обращения к потерявшим смысл переменным, а охраняемыми данными подвергаются гарантированной зачистке.
Комментариев нет:
Отправить комментарий