Подпрограммы

Грамматика


FUNCTION_DECL : procedure name [FUNCTION_DECL_PARAMS] ";" FUNCTION_DECL : function name [FUNCTION_DECL_PARAMS] ":" DATATYPE ";" FUNCTION_DECL_PARAMS : "()" FUNCTION_DECL_PARAMS : "(" FUNCTION_DECL_PARAMS_LIST ")" FUNCTION_DECL_PARAMS_LIST : FUNCTION_DECL_PARAM FUNCTION_DECL_PARAMS_LIST : FUNCTION_DECL_PARAMS_LIST ";" FUNCTION_DECL_PARAM FUNCTION_DECL_PARAM : [PASSING_TYPE] name ":" DATATYPE PASSING_TYPE : const PASSING_TYPE : var PASSING_TYPE : out FUNCTION_BLOCK : FUNCTION_DECL [VAR_BLOCK] COMPOUND_STATEMENT ";"

Объявления подпрограмм

В приведённой выше грамматике везде используется слово "функция", хотя в языке присутствуют не только функции, но и процедуры. Это объясняется тем, что я много работал с C++, в котором нет понятия процедуры - есть функции, не возвращающие значения - и использовал при составлении грамматики привычные для меня термины. В дальнейшем, если я употреблю слово "функция", оно будет означать функцию в смысле языка Паскаль.

Объявление подпрограммы помещается в блоке declaration, если подпрограмма не имеет реализации, или в блоке implementation в составе определения подпрограммы, если подпрограмма имеет реализацию.

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

Список параметров может быть пустым, всего лишь из пары круглых скобок, или содержать между двумя круглыми скобками последовательность параметров, отделённых друг от друга точкой с запятой.

Параметр состоит из необязательного модификатора способа передачи, имени, двоеточия и типа данных. Параметры могут иметь как простой тип данных, так и структурированный. В отличие от обычного Паскаля, нельзя создавать конструкции вида A,B:Integer, если передаётся два параметра одного типа, надо два раза написать их объявления.

Существует четыре способа передачи параметров, которые можно применять для всех типов данных, в том числе и структурированных:

Определения подпрограмм

Определение подпрограммы помещается в блоке implementation и состоит из объявления подпрограммы, необязательного блока локальных переменных и составного оператора, состоящего из ключевых слов begin и end и операторов, помещённых между ними. Определение завершается точкой с запятой. Имена параметров и локальных переменных не могут совпадать с глобальными именами. Т.е. если мы имеем глобальную константу, переменную или подпрограмму с именем Alpha, то ни одна подпрограмма не может объявить параметр или локальную переменную с таким же именем.

Возврат значений из функций

Возврат значений из функции осуществляется присвоения возвращаемого значения встроенной автоматически создаваемой переменной Result. Вообще, переменную Result можно использовать как обычную переменную, за исключением того, что её значение при выходе из функции является возвращаемым.

Примеры


unit Differential; declaration function F(X:Real):Real;//объявление функции без определения interface GetDiff; implementation const DeltaX : Real = 0.0001; //определение функции включает в себя объявление function GetDiff(X:Real):Real; begin Result := (F(X+DeltaX)-F(X-DeltaX)) / (2*DeltaX); end; end.