4.1 Классы
Класс — это набор предложений языка, имеющий уникальное имя
и входящий в состав иерархии наследования:
определение-класса =
class заголовок.класса ":" атрибуты "[" предложения "]"
В языке используется одиночное наследование: у класса может
быть не более одного непосредственного предка и неограниченное число потомков. Имя
непосредственного предка указывается в определении после имени класса:
заголовок_класса =
имя_класса [ specializing имя_ класса ]
имя_класса = символ_в_апострофах
В иерархии наследования классов, используемых проектом,
запрещены циклические зависимости.
Примечание. Неаккуратное (взаимно-) рекурсивное использование
классов может приводить к бесконечному увеличению количества миров в
ходе формирования экземпляров классов.
Пример.
Правильно построенный класс.
class 'MyWindow' specializing 'Report':
text_color = 'Green';
[
goal:-
show,!.
4.1.1 Атрибуты классов
Атрибутами называются имена слотов экземпляра класса,
определяемые в составе класса. Каждый атрибут должен быть объявлен во всех классах,
связанных отношением наследования, в которых используется
соответствующий слот. Область действия атрибута
распространяется на инициализаторы слотов в определении атрибутов класса, а также на все
предложения класса.
атрибуты = { определение_атрибута ";'' }
определение_атрибута =
[ описатель_порта ":" ] атрибут [ "=" инициализатор ]
описатель_ порта = suspending | protecting
атрибут = простой_символ
В составе инициализаторов слотов могут использоваться
переменные. Область действия таких переменных ограничена множеством инициализаторов
слотов в определении атрибутов класса. В определении атрибутов класса не допускается
однократное использование переменных, отличных от «_».
Атрибут self — предопределённый, он обозначает непосредственно тот экземпляр класса, в котором это имя используется.
Повторное определение атрибутов класса (в том числе переопределение атрибута self) считается синтаксической ошибкой.
Пример.
Правильно определённые атрибуты класса:
а = Y;
b;
c='f'(_[3,7],Y,a);
g=_;
i = [0,_,j|R];
е = ('Q',x='+'(a,f),m=self,k=e);
f='*'(Y,7);
d = [];
h = {x:1,y:Y,z:R|_};
j = a;
4.1.2 Инициализаторы слотов
Инициализатором слота называется синтаксическая
конструкция, определяющая начальное значение слота:
инициализатор = терм | конструктор
4.1.3 Конструкторы
Конструктором называется утверждение о существовании
экземпляра класса или резидента. В результате доказательства конструкторов происходит
построение новых экземпляров классов и резидентов.
Различаются конструкторы миров
(а именно простые конструкторы и конструкторы процессов),
а также конструкторы резидентов.
конструктор = конструктор_мира | конструктор.резидента
конструктор_мира =
простой_конструктор | конструктор_процесса
Простым конструктором называется элементарное
логическое утверждение о существовании экземпляра класса.
"(" имя_класса { ",'' определение-атрибута } ")"
Конструктор процесса — это утверждение о существовании
процесса. Доказательство конструктора процесса приводит к созданию нового процесса.
конструктор_процесса = "(" простой-конструктор ")"
Аргументы конструктора мира определяют значения слотов соответствующего экземпляра класса (значения слотов процесса).
Отсутствие инициализатора в определении некоторого
атрибута конструктора с именем Name является допустимым только в том случае, если
рассматриваемый конструктор экземпляра класса находится в области действия слота с
именем Name. Такое определение атрибута эквивалентно определению вида «Name=Name».
В конструкторе экземпляра класса не допускается
определение нескольких атрибутов с одинаковыми именами. Не допускается также определение
атрибута self.
Конструктором резидента называется синтаксическая
конструкция, определяющая резидента. Конструктор резидента определяет целевые миры
резидента и соответствующую резиденту атомарную формулу. Доказательство конструктора
резидента приводит к созданию нового резидента.
конструктор-резидента =
[ параметр_или_конструктор ] "??" простой_атом
параметр_или_конструктор =
целевой_параметр | конструктор_мира
целевой_параметр = параметр
Атомарная формула в составе конструктора резидента
является вызовом функции. В качестве простых атомов в конструкторе резидента не
разрешается использовать метаатомы.
Пример.
Правильно построенные конструкторы:
('R53',a=1,b=7,c=_,'d'), (('W',q=3)), ('E') ?? f(A)
Содержание