Попробовал вот такой код:
MODULE TestWith;
IMPORT Log;
TYPE
R0 = POINTER TO EXTENSIBLE RECORD END;
R1 = POINTER TO RECORD (R0) a: ARRAY 100 OF CHAR END;
R2 = POINTER TO RECORD (R0) END;
R3 = POINTER TO RECORD (R0) END;
VAR
globalPointer: R0;
PROCEDURE NewR1 (): R1;
VAR x: R1;
BEGIN NEW(x); RETURN x
END NewR1;
PROCEDURE NewR2 (): R2;
VAR x: R2;
BEGIN NEW(x); RETURN x
END NewR2;
PROCEDURE NewR3 (): R3;
VAR x: R3;
BEGIN NEW(x); RETURN x
END NewR3;
PROCEDURE Print (x: R0);
BEGIN
IF x IS R1 THEN Log.String("R1"); Log.Ln
ELSIF x IS R2 THEN Log.String("R2"); Log.Ln
ELSIF x IS R3 THEN Log.String("R3"); Log.Ln
END
END Print;
PROCEDURE f (VAR localPointer: R0);
VAR
a: INTEGER;
BEGIN
WITH localPointer: R1 DO (* убедились, что localPointer стопудово указывает на R1 *)
Print(localPointer);
globalPointer := NewR2(); (* начиная с этого места localPointer тоже указывает на R2 *)
Print(localPointer); localPointer.a := "jsdfdfkjghdfkjgkjdfgjdkfhgkjdfhgkjdfghkjdfhgkjdfhgkjdfhgkjdhfgkjhdfkjghdfk";
globalPointer := NewR3(); (* начиная с этого места localPointer тоже указывает на R3 *)
Print(localPointer)
ELSE
END
END f;
PROCEDURE Do*;
BEGIN
globalPointer := NewR1();
f(globalPointer)
END Do;
END (^Q)TestWith.Do
ЧЯ то никак не реагирует, то падает без трапа, а иногда выдает бесконечную гирлянду траповых окошек, пока виндозным диспетчером не срубишь....