Вот хороший пример для обсуждения (из книги "Проект Оберон"):
PROCEDURE Handle (F: Display.Frame; VAR M: Display.FrameMsg);
VAR F1: Frame;
BEGIN
WITH F: Frame DO
IF M IS Oberon.InputMsg THEN
WITH M: Oberon.InputMsg DO
IF M.id = Oberon.track THEN Edit(F, M.X, M.Y, M.keys)
ELSIF M.id = Oberon.consume THEN
IF F.car # 0 THEN Write(F, M.ch, M.fnt, M.col, M.voff) END
END
END
ELSIF M IS Oberon.ControlMsg THEN
WITH M: Oberon.ControlMsg DO 92
IF M.id = Oberon.defocus THEN Defocus(F)
ELSIF M.id = Oberon.neutralize THEN Neutralize(F)
END
END
ELSIF M IS Oberon.SelectionMsg THEN
WITH M: Oberon.SelectionMsg DO GetSelection(F, M.text, M.beg, M.end, M.time) END
ELSIF M IS Oberon.CopyOverMsg THEN
WITH M: Oberon.CopyOverMsg DO CopyOver(F, M.text, M.beg, M.end) END
ELSIF M IS Oberon.CopyMsg THEN
WITH M: Oberon.CopyMsg DO Copy(F, F1); M.F := F1 END
ELSIF M IS MenuViewers.ModifyMsg THEN
WITH M: MenuViewers.ModifyMsg DO Modify(F, M.id, M.dY, M.Y, M.H) END
ELSIF M IS UpdateMsg THEN
WITH M: UpdateMsg DO
IF F.text = M.text THEN Update(F, M) END
END
END
END
END Handle;
Тут приходится делать и пробу и охрану.
В Обероне 07 вместо:
WITH M: Oberon.CopyOverMsg DO CopyOver(F, M.text, M.beg, M.end) END
будет:
M(Oberon.CopyOverMsg).CopyOver(F, M.text, M.beg, M.end)
А в Обероне 2 весь ELSIF IS WITH заменится на один многоветочный WITH.