> -- Vlad писал(а):
> 
Не совсем понятно что здесь написано. Если я правильно это понял, то лучше бы записать это как-то так:
## Код:
```
IFEXWAIT не_хотим_ждать OR condition THEN
   IF не_хотим_ждать THEN RETURN END;
   ASSERT(condition);
   ...
END
```

Здесь я использовал выдуманный синтаксический блок
IFEXWAIT ... THEN ... END
объединяющий в себе обычные EXCLUSIVE и AWAIT.
Так вот, этот код, хоть и имеет свой смысл, но он не эквивалентен исходному коду:
## Код:
```
BEGIN{EXCLUSIVE} 
  IF ~condition THEN 
    IF не_хотим_ждать THEN 
      RETURN 
    ELSE 
      AWAIT(condition) 
    END 
  END;
  ASSERT(condition);
  ...
END
```

а эквивалентен такому коду:
## Код:
```
BEGIN{EXCLUSIVE} 
  AWAIT(не_хотим_ждать OR condition);
  IF не_хотим_ждать THEN RETURN END;
  ASSERT(condition);
  ... 
END
```

логика работы у них разная: первый всё таки дожидается наступления события condition = TRUE, а второй прерывает ожидание когда кто-то изменит переменную не_хотим_ждать на TRUE.

Допустим у нас есть две переменные: "не_хотим_ждать" и "надоело_ждать", тогда возможен код:
## Код:
```
BEGIN{EXCLUSIVE}
  IF ~condition THEN
    IF не_хотим_ждать THEN
      RETURN
    ELSE
      AWAIT(надоело_ждать OR condition);
      IF надоело_ждать THEN RETURN END
    END
  END;
  ASSERT(condition);
  ...
END
```

реализовать его с помощью блока IFEXWAIT ... THEN ... END, кажется невозможно.

Кстати, EXCLUSIVE - блоки в Active Oberon не могут быть вложенными (используется быстрое, но нереентерабельное залочивание объекта this).