столкнулся с непроходимой трудностью. при компиляции данного кода:
Код:
PROCEDURE (h: Handler) Do* (op: INTEGER; f, g: Views.Frame; VAR msg: Views.CtrlMessage; VAR mark, front, req: BOOLEAN);
<...> WITH msg: CursorMessage DO
msg.x := msg.x + f.gx - g.gx;
msg.y := msg.y + f.gy - g.gy
ELSE
END
<...>
END Do;
компилятор выдаёт:
Код:
402 msg.x := msg.x + f.gx - g.gx;
**** This variable is read-only------^
403 msg.y := msg.y + f.gy - g.gy
**** This variable is read-only------^
казалось бы, VAR параметр. и если написать тестовый модуль, то компилятор пропускает такую конструкцию:
Код:
PROCEDURE DoMy*(VAR m: MyMsg);
BEGIN
m.x:=0;
END DoMy;
однако стоит ввести абстрактный/расширяемый тип записи и оформить процедуру вот так:
Код:
PROCEDURE Do*(VAR m: Msg);
BEGIN
WITH m: MyMsg DO
m.x:=0;
ELSE END;
END Do;
получим то же самое предупреждение от компилятора:
Код:
14 m.x:=0;
**** ------------------------^ This variable is read-only
собственно, такое поведение описано в ReleaseNotes
Цитата:
The semantics of the WITH statement have been slightly modified so as to strengthen
the guarantees on the properties of the selected variable. In the code —
WITH x : TypeTi DO
... (* guarded region *)
| x : TypeTj DO
... (* guarded region *)
END;
the variable x is asserted to have the specified type throughout the so-called guarded
region. The base language guarantees that the type of the selected variable cannot be
“widened” in the guarded region, but might possibly be narrowed. In gpcp the selected
variable is treated as a constant, and neither the type nor the value can be modified
either directly or indirectly. Any attempt to do so attracts a compile-time error message.
это сводит все возможности реализации хоть какого-то подобия ББ к нулю, потому что, если посмотреть код хэндлеров сообщений реализаций Views.View то мы увидим, что в половине из них присваиваются значения внутри секций WITH а значит код становится непотрируемым. проще говоря, если у меня не получится просто взять и перетащить свой прикладной модуль без правок в будущий возможный клон GPCP то этот клон не имеет смысла.
такие вот дела.