В работе
Patrik Reali "Критика языка Oberon" справедливо указан недостаток синтаксиса:
терм x(T) может означать либо вызов процедуры x с параметром Т, либо приведение переменной х к типу Т. Только из синтаксиса это понять нельзя, требуется семантическая информация.
Компилятор, конечно, такой информацией обладает и без проблем разбирается, какой из случаев имеет место. Но этот недостаток синтаксиса снижает наглядность и вызывает затруднения при разборе чужого кода, а также путаницу у начинающих (в одном из видеоуроков Ивана Денисова слушатель принял такое приведение типа за вызов функции).
Более удачным был бы синтаксис "x(:T)". Двоеточие после открывающейся скобки не может встретиться в каком-то корректном оберон-выражении, поэтому конфликтов не должно возникать.
Лучше бы, если это двоеточие было обязательно для приведения (охраны) типов. Но для совместимости с прочими версиями Оберона придется, видимо, сделать его необязательным, добавляемым только для наглядности.
Для этого можно изменить процедуру selector в модуле OPP. Во фрагмент
Код: "OBERON"
...
ELSIF (sym = lparen) & (x^.class < Nconst) & (x^.typ^.form # ProcTyp) &
((x^.obj = NIL) OR (x^.obj^.mode # TProc)) THEN
OPS.Get(sym);
IF sym = ident THEN
...
добавить одну строчку, чтобы получить
Код: "OBERON"
...
ELSIF (sym = lparen) & (x^.class < Nconst) & (x^.typ^.form # ProcTyp) &
((x^.obj = NIL) OR (x^.obj^.mode # TProc)) THEN
OPS.Get(sym);
IF (sym = colon) & (OPM.Lang = "3") THEN OPS.Get(sym) END;
IF sym = ident THEN
...
Добавленная строка просто пропускает двоеточие, если таковое добавлено (для языка О3).