Как и процедуры, функции инкапсулируют вычисления, так что ни могут быть легко использованы и могли быть модифицированы передачей различных аргументов при использовании. Однако, функции возвращают значения и вызываются по имени внутри выражений.
Объявления процедур инкапсулируют последовательности операций, часто для вычисления и возврата значения через параметр-переменную. Объявления и вызовы функций в Паскале обеспечивают другой способ возвращения вычисленного значения. Объявления функций выглядят в основном как объявления процедур, но заголовок заканчивается двоеточием и идентификатором типа, обозначая тип результата. Процедура передает результаты, присваивая значения ее параметрам. Внутри блока объявления функции, результат обозначается присваиванием идентификатору, который является именем функции. Если внутри блока не сделано присваивания этому идентификатору, результат вызова функции неопределен. Механизм возвращения результата показан ниже:
| FUNCTION <идентификатор> <список формальных параметров> : <тип результата>
Вызовы функций выглядят как вызовы процедур. За именем функции следует список фактических параметров, который представляет собой выражения, разделенные запятыми. Однако есть важное различие между вызовами функций и процедур. Поскольку функции возвращают значения, вызовы функций являются выражениями, которые могут появляться внутри других выражений или просто появляться там, где в программе может появляться выражение. Процедурные вызовы не возвращают значений и являются операторами. Для нахождения максимума из трех значений Max3 может быть объявлена, используя два вызова Max2 в правой части операторов присваивания.
FUNCTION Max3(P1, P2, P3: INTEGER): INTEGER;
{Max3 присваивается наибольшее значение из P1, P2, P3}
VAR
T: INTEGER;
BEGIN {Max3}
T := Max2(P2, P3);
Max3 := Max2(P1, T);
END; {Max3}
Когда Max2 вызывается первый раз , она возвращает наибольшее из P2, P3, которое присваивается T. Далее T используется как фактический параметр во втором вызове Max2. Поскольку вызовы функций могут появляться везде, где появляются выражения, а параметры Max2 являются параметрами-значениями, Max3 может быть переписана так, что первый вызов Max2 будет параметром в ее втором вызове.
FUNCTION Max3(P1, P2, P3: INTEGER): INTEGER;
{Max3 присваивается наибольшее значение из P1, P2, P3}
BEGIN {Max3}
Max3 := Max2(P1, Max2(P2, P3));
END; {Max3}
Выражение в операторе присваивания будет вычислено сначала вызовом Max2 для получения максимума P2, P3 и далее вызовом Max2 с P1 и результатом предыдущего вызова.
Следующие синтаксические правила включают вызовы функций в синтаксис выражений добавлением и к <множителю>.
<множитель> ::= <переменная> | <вызов функции>
|<беззнаковая константа> | (выражение) | NOT <множитель>