Изучаем перегрузку операций в A2/AO

Операционная система, написанная на языке Оберон и проект её перевода на русский язык. Только технические вопросы.
Ответить
БудДен
Сообщения: 882
Зарегистрирован: 07.10.18 14:01

Изучаем перегрузку операций в A2/AO

Сообщение БудДен » 07.05.20 17:36

В A2 можно перегрузить много операций, операторов и похоже, что даже неявное преобразование типа.

Перечень операций и встроенных функций можно найти примерно по подстроке ResolveOperator в FoxSemanticChecker

Из интересного:

равенство, неравенство, оператор транспонирования `, оператор отрицания ~, операторы почленного сравнения .=, .< и т.п., операторы .* и ./,

Присваивание.

Здесь будет уместно осознать, что для ARRAY OF CHAR сравнение идёт в семантике строк, заканчивающихся нулём. Т.е. то, что за первым нулём - игнорируется.

БудДен
Сообщения: 882
Зарегистрирован: 07.10.18 14:01

Re: Изучаем перегрузку операций в A2/AO

Сообщение БудДен » 07.05.20 17:38

Код: Выделить всё

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 ~

Ответить