Как мы знаем, в Си (и в Object Pascal) можно вызвать функцию с игнорированием её результата. Это часто используется, например, при работе с WinApi, где многие функции принято вызывать таким способом, ибо их результаты иногда побочные и поэтому не нужны в вызывающем коде.
Оберон в этом смысле является более строгим: он считает, что раз в процедуре предусмотрен результат, то уж пусть программист не забудет его получить и проанализировать, чтобы избавиться от всевозможных потенциальных проблем. Впрочем, ETH Oberon (OPCL), насколько я помню, тоже разрешает игнорировать результат процедур. Просто замените код на Windows.WriteFile(hout, str, n, n, NIL), должно работать.
Так что SYSTEM.PUTREG — это просто уловка, которая придумана для Компонентного Паскаля (в реализации BlackBox) чтобы не использовать таких лишних переменных:
Код: "OBERON"
VAR dumb: INTEGER;
BEGIN dumb := Windows.WriteFile(hout, str, n, n, NIL); (* Далее dumb не используется нигде. *)
В рассылке по BlackBox предложили ещё и такой вариант:
Код: "OBERON"
IF Windows.WriteFile(hout, str, n, n, NIL) = 0 THEN END;
но мною экспериментально было выяснено, что компилятор не оптимизирует это выражение, генерируя проверку и пустой переход.
SYSTEM.PUTREG(0, ...) же говорит компилятору, что результат нужно поместить в регистр EAX (кодируется значением 0). А поскольку в реализации BlackBox для возвращения 32-битных значений и так используется регистр EAX, мы имеем самый оптимальный код. Так что это просто эффективный способ проигнорировать результат процедуры.
Конечно, способ системный и не очень в духе Оберона, но для низкоуровневых применений вполне годится. Другой вопрос: правильно ли сделал профессор Вирт, что не разрешил игнорирование результата? Я уверен, что это оправданное решение. В Обероне есть такие фишки, которые на взгляд опытного сишника покажутся неудобством, т.к. принуждают более продуманно писать код, но как итог — экономится много времени на отладке.
Ведь явно использованный SYSTEM.PUTREG говорит о принятом программистом решении проигнорировать результат, а не о том, что, возможно (а часто и случается при работе на Си), программист просто о нём забыл.