nextupprevious

Next:1.7 Предопределенные процедуры
Up:1 Язык программирования Zonnon
Previous:1.5 Операторы


1.6 Объявления процедур и формальные параметры


Объявление процедуры состоит из заголовка процедуры и тела процедуры. Заголовок специфицирует идентификатор процедуры и формальные параметры, если они есть. Тело содержит объявления и операторы. Идентификатор процедуры повторяется в конце объявления процедуры. Процедура, объявленная в объекте, называется методом.

Имеется два вида процедур: собственно процедуры и процедуры функции. Последние активируются обозначениями функции как частей выражений и вырабатывают результаты, которые являются операндами этих выражений. Собственно процедуры активируются вызовами процедур. Процедура является процедурой функцией, если ее формальные параметры специфицируют тип результата. Тело процедуры функции должно содержать оператор return, который определяет этот результат.

Все константы, переменные, типы и процедуры, объявленные в теле процедуры являются локальными по отношению к процедуре. Поскольку процедуры могут быть также объявлены как локальные элементы, процедурные объявления могут быть вложенными (предмет для ограничений при реализации). Вызов процедуры в ее объявлении приводит к рекурсивной активации.

В дополнение к ее локальным параметрам и локально описанным элементам элементы, описанные в теле процедуры, также видны в процедуре (за исключением тех элементов, которые имеют те же имена, что и элементы, объявленные локально).

ProcedureDeclaration = ProcedureHeading [ ImplementationClause ] ";" [ ProcedureBody ";" ].
ProcedureHeading = procedure [ ProcModifiers ] ProcedureName [ FormalParameters ].
ProcModifiers = "{" ident { "," ident } "}". // private, public, sealed
ProcedureBody = Declarations BlockStatement SimpleName.
FormalParameters = "(" [ FPSection { ";" FPSection } ] ")" [ ":" FormalType ].
FPSection = [ var ] ident { "," ident } ":" FormalType.

Формальные параметры являются идентификаторами, объявленными в списке формальных параметров процедуры. Они соответствуют фактическим параметрам, специфицированным в вызове процедуры. Это соответствие устанавливается, когда происходит вызов процедуры. Имеется два вида параметров, параметры значения и переменные, указанные в списке формальных параметров с помощью отсутствия или наличия ключевого слова var. Параметры значения являются локальными переменными, которым присваивается в качестве начальных значения соответствующих фактических параметров. Параметры переменные соответствуют фактическим параметрам, являющимся переменными, и они означают эти переменные. Область действия формального параметра простирается от его объявления до конца блока процедуры, в которой он объявлен. Процедура функция без параметров должна иметь пустой список параметров. Она должна вызываться обозначением функции, список фактических параметров которого также пуст.

Правила соответствия между формальными и фактическими параметрами следующие. Пусть Tf является типом формального параметра f (не открытый массив) и Ta    тип соответствующего фактического параметра a. Для параметра переменной тип Ta должен быть тем же, что и Tf, или Tf должен быть типом object, а Ta являться расширением Tf. Для параметров значений формальный параметр a должен быть совместим по присваиванию с f (см. 1.11.4).

Если Tf является открытым массивом, тогда a должна быть массивом совместимым с f (см. 1.11.5). Длина f берётся из a.
 

1.6.1. Модификаторы процедуры


Факультативно после ключевого слова procedure можно разместить модификатор для обозначения природы процедуры. Определены следующие модификаторы:
 


Примеры:

procedure ReadInt(var x: integer);
    var i: integer; ch: char;
begin
    i := 0; read(ch);
    while ("0" <= ch) & (ch <= "9") do
        i := 10*i + (integer(ch) - integer("0")); read(ch)
    end;
    x := i
end ReadInt;

procedure {private} WriteHex(x: integer);
    (* предусловие: 0 <= x <100000H *)
    var i: integer; buf: array 5 of integer;
begin
    i := 0;
    repeat buf[i] := x mod 10H; x := x div 10H; inc(i) until x = 0;
    repeat dec(i);
        if buf[i] < 10 then write(char(buf[i] + integer("0")))
        else write(char(buf[i] – 10 + integer("A")))
        end
    until i = 0
end WriteHex;

procedure log2(x: integer): integer;
    (* предусловие: x > 0 *)
    var y: integer;
begin
    y := 0;
    while x > 1 do x := x div 2; inc(y) end;
    return y
end log2;
 

1.6.2. Свойства


Свойство (property) является переменной, для которой процедуры доступа предоставляются программистом и автоматически вызываются всякий раз, когда ее значение читается или записывается. Всякий раз, когда происходит доступ к значению переменной в выражении, вызывается функция с именем get; всякий раз, когда значение переменной устанавливается присваиванием, вызывается процедура с именем set. Переменная, для которой предоставлена только функция get, является 'только для чтения' (‘read only’). Переменная, для которой предоставлена только процедура set, является 'только для записи' (‘write only’).

definition D;
    var x: T;

end D.

object O implements D;
    procedure {get} Getx ( ): T implements D.x;
    (* 'getter': вызываемая автоматически, когда происходит доступ к x *)
    begin
        …
        return (…)
    end Getx;
    procedure {set} Setx (expression: T ) implements D.x;
    (* 'setter': вызывается автоматически, когда x получает значение выражения*)
    begin
        …
    end Setx;
end O.
 
 
 
 

Next:1.7 Предопределенные процедуры
Up:1 Язык программирования Zonnon
Previous:1.5 Операторы


 © В.Н. Касьянов, Е.В.Касьянова,2004