В A2 можно перегрузить много операций, операторов и похоже, что даже неявное преобразование типа.
Перечень операций и встроенных функций можно найти примерно по подстроке ResolveOperator в FoxSemanticChecker
Из интересного:
равенство, неравенство, оператор транспонирования `, оператор отрицания ~, операторы почленного сравнения .=, .< и т.п., операторы .* и ./,
Присваивание.
Здесь будет уместно осознать, что для ARRAY OF CHAR сравнение идёт в семантике строк, заканчивающихся нулём. Т.е. то, что за первым нулём - игнорируется.
Изучаем перегрузку операций в A2/AO
Re: Изучаем перегрузку операций в A2/AO
Код: Выделить всё
MODULE Proba;
IMPORT KernelLog, Commands, UCS32, Streams, Trace;
TYPE Ukhty = RECORD
sutq* : SIZE END;
OPERATOR ".#"*(a, b : Ukhty) : BOOLEAN;
BEGIN RETURN a.sutq # b.sutq END ".#";
PROCEDURE TestUkhty*(c : Commands.Context);
VAR a, b: Ukhty;
BEGIN
a.sutq := 7;
(* IF a # b THEN - оператор не определён *)
ASSERT(a .# b) END TestUkhty;
PROCEDURE TestArrayOfChar*(c: Commands.Context);
VAR a1, a2, a3 : ARRAY 7 OF CHAR;
VAR b : ARRAY 6 OF CHAR;
VAR pa1, pa2 : POINTER TO ARRAY OF CHAR;
BEGIN
COPY("abc",a1);
COPY("abc",a2);
COPY("abc",a3);
a3[5]:="k";
COPY("abc",b);
ASSERT(a1 = a1);
ASSERT(a1 = a2);
ASSERT(a1 = a3);
ASSERT(a1 = b);
ASSERT(a3 = b);
(* Вывод - строки сравниваются почленно до первого #0 *)
NEW(pa1, 3); NEW(pa2, 3);
ASSERT(pa1 # pa2); (* указатели на строки равны, когда они указывают на один и тот же объект *)
ASSERT(pa1 = pa1);
END TestArrayOfChar;
PROCEDURE TestArrayOfInt(c : Commands.Context);
VAR ia1, ia2, ia3 : ARRAY 7 OF INTEGER;
VAR ib : ARRAY 6 OF INTEGER;
BEGIN
ia1[0] := 1;
ia2[0] := 1;
ia3[0] := 1;
(** Оператор не определён!
ASSERT(ia1 = ia2); *)
(** И этот не определён, что уже выглядит загадочным
ASSERT(ia1 .= ia2);
*)
END TestArrayOfInt;
PROCEDURE TestS*(c : Commands.Context);
BEGIN
TestUkhty(c);
TestArrayOfChar(c);
TestArrayOfInt(c);
END TestS;
END Proba.TestS ~