На данный момент не существует «отдельного выражения», подобного «отдельной инструкции». И, как вы упоминаете, отдельные инструкции не допускаются в контексте, где ожидается только логическое выражение, в частности в постусловиях.
Даже если бы существовала такая конструкция, она не работала бы. Отдельный объект может изменить свое состояние между двумя последующими отдельными инструкциями. Например, следующий код неверен:
separate foo as x do
x.put (something) -- Set `foo.item` to `something`.
end
separate foo as x do
check
item_is_known: x.item = something
end
end
Команда проверки может легко привести к нарушению утверждения в следующем сценарии выполнения:
- Первая отдельная команда выполняется.
- Другой процессор выполняет вызов
foo.put
. - Команда проверки сравнивает
something
со значением, установленным на шаге 2.
Если код имеет чтобы обеспечить какое-либо свойство отдельного объекта, его следует заключить в тело рутины, а отдельный объект следует передать в качестве аргумента:
set_position (value: like position; keeper: like status_keeper)
do
position := value
keeper.set_position (value)
ensure
position = value
keeper.position = value
end
Были изобретены отдельные инструкции только для Избегайте написания однострочных оболочек просто для вызова отдельного объекта. В остальном лучше использовать оригинальный подход S COOP с полноценными функциями с отдельными аргументами.