Next:1.9
Программные единицы
Up:1
Язык программирования Zonnon
Previous:1.7
Предопределенные процедуры
Объявление активности подобно объявлению метода (процедуры), в котором
опущен список параметров. Зарезервированное слово activity используется,
чтобы отличить объявление активности от объявления метода. Активности также
могут иметь модификаторы private и public для управления их видимостью.
Когда активность объявлена, ее экземпляры могут создаваться в любом активном
объекте или модуле.
Семантически разница между активностью и методом более существенна. Активности объявлены и затем воплощены (запущены), а не вызваны, и новая активность размножается с каждым запуском.
Операция new используется, чтобы создать каждый экземпляр активности.
Активности предоставляют средства инкапсулированного поведения,
добавленного к объекту или модулю (рассматриваемому как отдельный объект).
Объект может содержать произвольное число активностей, или не содержать
их вовсе, и в этом случае он является пассивным объектом. Обычно поведенческие
активности являются приватными по отношению к объекту (или модулю), который
содержит их, и создаются и размножаются конструктором.
Пример:
object Cell (*конвейера*);
type Job = …;
var in, out, n: integer;
buf: array N of
Job;
procedure Get (j: Job);
begin …
end Get;
procedure { public } Put (j: Job);
begin …
end Put;
activity Process;
var … (*пространство состояний активности*)
begin …
end Process;
var p: Process;
begin
n := 0; in := 0; out :=
0;
p := new Process
(*Создать активность в Cell *)
end Cell;
Реальный обмен синтаксическими лексемами между вызывающим и вызываемым
управляется с помощью операций send и receive, описанным
в разделах 1.6.12 и 1.6.13, где receive имеет родовой аргумент объекта.
Если необходимо, знак операции is может тогда использоваться для
распознавания разных типов синтаксических лексем (см. 1.4.2.5).
Определение активности может включать диалог, котрый является формальную
синтаксическую спецификацию коммуникационного протокола в РБНФ. Он представляется
в виде модификатора к типу перечисления, который определяет алфавит терминальных
лексем синтаксиса. Название активности и ее тип перечисления образуют сигнатуру
активности. Заметим, что в спецификации протокола в виде РБНФ к коммуникации
элемента от вызывающего к вызываемому приставляется спереди “?”.
Пример:
definition Fighter;
activity (* Синтаксис протокола, в данном
случае он рекурсивный *)
{ fight = { attack ( { defense
attack } | RUNAWAY [ ?CHASE] | KO | fight ) }.
attack = ATTACK strike.
defense = DEFENSE strike.
strike = bodypart [ strength
].
bodypart = LEG | NECK |
HEAD.
strength = integer. }
Karate = (RUNAWAY, CHASE, KO, ATTACK, DEFENSE, LEG,
NECK, HEAD);
end Fighter.
object Opponent implements Fighter;
activity Karate implements Fighter.Karate;
var t: object;
procedure fight;
begin
while t is ATTACK do
receive t;
while t is DEFENSE do receive t; strike
if t is ATTACK then strike else halt(protokolError)
end
end;
if t is RUNAWAY then
if (*не истощен*) then send Karate.CHASE end;
return (* борьба завершается *)
elsif t is KO then return (* борьба завершается *)
elsif t is ATTACK then fight (* рекурсия, продолжается
борьба *)
else halt(protocolError) (* ошибка протокола *)
end
end
end fight;
procedure strike;
begin
if (t is LEG) or (t is NECK) or (t is
HEAD)
then
receive t;
if t is integer then (* необычная сила *) receive
t end
end
end strike;
begin (* Karate*)
receive t;
fight
end Karate;
end Opponent.
object Challenger;
import Opponent, Fighter;
var opp: Opponent; f: Fighter.Karate;
opp := new Opponent; (* создать оппонента
*) …
f := new opp.Fighter.Karate; (* создать диалог
*)
send Fighter.Karate.ATTACK => f; … (* борьба
соответствующая протоколу диалога *)
…
end Challenger.
Объект может только тогда завершиться, когда на него больше нет
ссылок и когда завершены все его активности. Активность завершается после
выполнения оператора непосредственно предшествующего end в ее теле процедуры.
Язык включает встроенные возможности для текстового ввода и вывода.
Концептуально чтение и запись соответствуют получению и посылке лексем
из и в предопределенные активности standard input и standard output соответственно.
Для удобства предоставлены предопределенные процедуры для чтения и выдачи
текста в Паскале-подобном стиле. Процедурами для ввода текста являются
read и readln, а для вывода – write и writeln. Все вводимое и выводимое
должно быть текстом, который неявно предполагается должен изображаться
как строки литер, разделенные символами конца строки.
Процедуры используются с нестандартным синтаксисом для их списков
параметров. Допускается переменное число параметров, которые могут быть
разных типов. Параметры типа char не требуют преобразования типов данных,
однако, для других типов (таких как целые, вещественные и др.) передача
данных включает неявное преобразование типов данных.
Процедура read имеет следующий вид
read (v1, …, vn)
Допускается один или больше параметров, каждый из которых является значением
некоторого базисного типа данных. Если v является значением типа char,
то read(v) передает следующую литеру входного текста в v. Если v является
значением типа byte, integer, cardinal или real, то read(v) означает чтение
последовательности литер из входного текста и присваивание прочитанного
числа v. Предшествующие пробелы и символы конца строки подавляются и отбрасываются.
Процедура readln имеет следующий вид
readln(v1, …, vn)
readln имеет ту же функциональность что и read за тем исключением, что
после чтения vn все оставшиеся литеры в строке игнорируются вплоть до (и
включая) следующего символа конца строки.
Процедура write имеет следующий вид
write (p1, …, pn)
Она может иметь один или несколько параметров, каждый из которых имеет вид
e , e:m или e:m:n
Здесь e изображает значение, которое выводится, а m и n спецификаторы ширины поля. Если значение e требует менее чем m литер для своего представления, то пробелы (промежутки) выводятся для того, чтобы гарантировать, что суммарно записано равно m литер. Если m опущено, то используется по умолчанию определенное реализацией число. Форма e:m:n применима только к числам типа real, см. ниже.
Параметры процедуры write могут иметь тип char, string, boolean, integer, cardinal и real.
Процедура writeln имеет следующий вид:
writeln (v1, …, vn)
Процедура writeln имеет ту же функциональность, что и write, с тем отличием,
что после записи vn помещается символ конца строки.
Значения параметров ширины поля по умолчанию для write и writeln
зависят от типа параметра следующим образом:
Next:1.9
Программные единицы
Up:1
Язык программирования Zonnon
Previous:1.7
Предопределенные процедуры