Спасибо всем за ответы.

После некоторого обдумывания решил не делать ORD для REAL. Может это и лихой трюк — использовать ORD(real) вместо SYSTEM.VAL(INTEGER, real) и, тем самым, избавиться от SYSTEM, но много смысла в таком декоре я не вижу. И поощрять такой стиль нам не следует. Ещё меньше смысла в ORD(Procedure). Что здесь вообще возвращается? Адрес процедуры? Так это системная вещь, её легко получить через SYSTEM.ADR.

Ещё вопрос. В Обероне-07 есть встроенные функции ASR (арифметический сдвиг вправо), LSL (логический сдвиг влево) и ROR (циклический сдвиг вправо), хотя логического сдвига вправо и циклического сдвига влево нет. Или Вирт решил, что такие сдвиги и не нужны. Может от бедности? Сложно сказать. Я вообще не понимаю, зачем понадобилось выносить логический и циклический сдвиги из SYSTEM в язык. Это же работа с битами.

Все имеющиеся операции сдвига имеют второй аргумент, указывающий на сколько битов сдвигать. В описании языка нигде не говорится, что будет, если он будет отрицательным. Подразумевается ли здесь сдвиг в другую сторону? Конечно это было бы красиво, хотя и вразрез с описанием языка, так сказать, неопределённое поведение.

Как бы вы посоветовали мне поступить? Реализовать сдвиги в обратную сторону? Ловить ошибку при отрицательном аргументе? Как с этим обстоят дела в различных реализациях Оберона-07?