var a := Seq(1,3,5); // тип a выводится по типу возвращаемого значения Seq: array of integer
Автовыведение типа при описании невозможно при инициализации переменной лямбда-выражением:
// var f := x -> x*x; // так нельзя!
var f : Func
Внутриблочные описания используются чтобы не захламлять раздел описаний описанием вспомогательных переменных. Кроме этого, внутриблочные описания позволяют вводить переменные именно в тот момент когда они впервые потребовались. Оба этих фактора существенно повышают читаемость программы.
Оператор выбора
Оператор выбора выполняет одно действие из нескольких в зависимости от значения некоторого выражения, называемого переключателем. Он имеет следующий вид:
case переключатель of
список выбора 1: оператор1;
...
список выбора N: операторN;
else оператор0
end;
Переключатель представляет собой выражение порядкового типа или строкового типа, а списки выбора содержат константы совместимого по присваиванию типа. Как и в операторе if, ветка else может отсутствовать.
Оператор case работает следующим образом. Если в одном из списков выбора найдено текущее значение переключателя, то выполняется оператор, соответствующий данному списку. Если же значение переключателя не найдено ни в одном списке, то выполняется оператор по ветке else или, если ветка else отсутствует, оператор case не выполняет никаких действий.
Список выбора состоит либо из одной константы, либо для перечислимого типа из диапазона значений вида a..b (константа a должна быть меньше константы b); можно также перечислить несколько констант или диапазонов через запятую. Например:
case Country of
'Россия': Capital := 'Москва';
'Франция': Capital := 'Париж';
'Италия': Capital := 'Рим';
else Capital := 'Страна отсутствует в базе данных';
end;
case DayOfWeek of
1..5: writeln('Будний день');
6,7: writeln('Выходной день');
end;
Списки выбора не должны пересекаться. Например, следующий фрагмент
case i of
2,5: write(1);
4..6: write(2);
end;
приведет к ошибке компиляции.
Оператор цикла for
Оператор цикла for имеет одну из двух форм:
for переменная := начальное значение to конечное значение do
оператор
или
for переменная := начальное значение downto конечное значение do
оператор
Кроме того, переменную можно описать непосредственно в заголовке цикла:
for переменная: тип := начальное значение to или downto конечное значение do
оператор
или
for var переменная := начальное значение to или downto конечное значение do
оператор
В последнем случае используется автоопределение типа переменной по типу начального значения. В двух последних случаях область действия объявленной переменной распространяется до конца тела цикла, которое в данном случае образует неявный блок. Вне тела цикла такая переменная недоступна, поэтому следующий цикл может использовать переменную с тем же именем:
for var i := 1 to 10 do
Print(i);
for var i := 1 to 5 do
Print(i*i);
Текст от слова for до слова do включительно называется заголовком цикла, а оператор после do - телом цикла. Переменная после слова