Begin
операторы
end.
Первая строка называется заголовком программы и не является обязательной.
Раздел uses состоит из нескольких подряд идущих секций uses, каждая из которых начинается с ключевого слова uses, за которым следует список имен модулей и пространств имен.NET, перечисляемых через запятую.
Раздел описаний может включать следующие подразделы:
Раздел описания переменных
Переменные могут быть описаны в разделе описаний, а также непосредственно внутри любого блока begin/end.
Раздел описания переменных начинается с ключевого слова var, после которого следуют элементы описания вида
список имен: тип;
или
имя: тип:= выражение;
или
имя: тип = выражение; // для совместимости с Delphi
или
имя:= выражение;
Имена в списке перечисляются через запятую. Например:
var
a,b,c: integer;
d: real:= 3.7;
s:= 'PascalABC forever';
al:= new List<integer>;
p1:= 1;
В последних трех случаях тип переменной автоматически определяется по типу правой части.
Раздел описания констант
Раздел описания именованных констант начинается со служебного слова const, после которого следуют элементы описания вида
имя константы = значение;
или
имя константы: тип = значение;
Например:
const
Pi = 3.14;
Count = 10;
Name = 'Mike';
DigitsSet = ['0'..'9'];
Arr: array [1..5] of integer = (1,3,5,7,9);
Rec: record name: string; age: integer end = (name: 'Иванов'; age: 23);
Arr2: array [1..2,1..2] of real = ((1,2),(3,4));
Раздел описания типов
Раздел описания типов начинается со служебного слова type, после которого следуют строки вида
имя типа = тип;
Например,
type
arr10 = array [1..10] of integer;
myint = integer;
pinteger = ^integer;
IntFunc = function(x: integer): integer;
Обычно описание используется для составных типов (статические массивы, процедурные переменные, записи, классы) чтобы дать имя сложному типу. Если для типа определена именная эквивалентность типов, это единственный способ передать переменные этого типа в подпрограмму.
Описание типов для классов использовать обязательно:
type
A = class
i: integer;
constructor Create(ii: integer);
begin
i:=ii;
end;
end;
Если описание типа используется просто для того чтобы заменить одно имя на другое, то такие типы называются синонимами типов:
type
int = integer;
double = real;
Раздел описания меток
Раздел описания меток начинается с зарезервированного слова label, после которого следует список меток, перечисляемых через запятую. В качестве меток могут быть использованы идентификаторы и положительные целые числа:
label a1,l2,777777;
Метки используются для перехода в операторе goto.
Раздел описания процедур и функций
Процедуры и функции: обзор
Процедура или функция представляет собой последовательность операторов, которая имеет имя, список параметров и может быть вызвана из различных частей программы. Функции, в отличие от процедур, в результате своего выполнения возвращают значение, которое может быть использовано в выражении. Для единообразия функции и процедуры называются подпрограммами.
Описание процедур и функций
Любая используемая в программе процедура или функция должна быть предварительно описана в разделе описаний.
Описание процедуры имеет вид:
procedure имя (список формальных параметров);
раздел описаний
begin
операторы
end;
Описание функции имеет вид:
function имя (список формальных параметров): тип возвращаемого значения;
раздел описаний
begin
операторы
end;
Операторы подпрограммы, окаймленные операторными скобками begin / end, называются телом этой подпрограммы.
Список формальных параметров вместе с окружающими скобками может отсутствовать. Он состоит из одной или нескольких секций, разделенных символом ";". Каждая секция состоит из списка переменных, перечисляемых через запятую, после которого следуют двоеточие и тип. Каждая секция может предваряться ключевым словом var или const, что указывает на то, что параметры передаются по ссылке. Тип формального параметра должен быть либо именем, либо динамическим массивом, либо множеством.
Раздел описаний процедуры или функции устроен так же, как и раздел описаний основной программы. Здесь описываются так называемые локальные переменные и константы, типы (за исключением классов - классы можно описывать только глобально) а также вложенные процедуры и функции. Все такие локальные объекты доступны лишь внутри данной подпрограммы и не видны извне.
В разделе описаний подпрограммы можно описывать другие подпрограммы. Исключение составляют методы класса, описываемые непосредственно в теле класса: в них нельзя описывать вложенные подпрограммы ввиду синтаксической неоднозначности.
Например:
procedure DoAdd(a,b: real; var res: real);
begin
res:= a + b;
end;
Вызов подпрограммы
Подпрограмма один раз описывается и может быть многократно вызвана. Для вызова процедуры используется оператор вызова процедуры:
begin
var x:= ReadInteger;
var y:= ReadInteger;
var res: integer;
DoAdd(x,y,res);
Print(res);
DoAdd(2*x,y,res);
Print(res);
end;
Для вызова функции используется выражение вызова функции.
Переменная Result
Внутри тела любой функции определена специальная переменная с именем Result, которая хранит результат вычисления функции. Ее тип совпадает с типом возвращаемого значения функции. Например:
function Sum(a,b: real): real;
begin
Result:= a + b;
end;
function MinElement(a: array of real): real;
begin
Result:= real.MaxValue;
foreach var x in a do
if x < Result then
Result:= x;
end;
begin
var a:= Seq(1,5,3);
writeln(MinElement(a) + Sum(2,3));
end.
Если внутри функции не присвоить переменной Result некоторое значение, то функция вернет в результате своего вызова непредсказуемое значение.