begin
for vari := 0 toa.Length-1 do
a[i] := f(a[i]);
end;
...
forall(a,x->x*2); // умножение элементов массива на 2
forall(a,x->x+3); // увеличение элементов массива на 3
Процедурная переменная может хранить нулевое значение, которое задается константой nil. Вызов подпрограммы через нулевую процедурную переменную приводит к ошибке.
Операции += и -= для процедурных переменных
Процедурные переменные реализуются через делегаты .NET. Это означает, что они могут хранить несколько подпрограмм. Для добавления/отсоединения подпрограмм используются операторы += и -=:
p1 += mult2;
p1 += add3;
forall(a,p1);
Подпрограммы в этом случае вызываются в порядке прикрепления: вначале умножение, потом сложение.
Отсоединение неприкрепленных подпрограмм не выполняет никаких действий:
p1 -= print;
Кроме того, к процедурной переменной можно прикреплять/откреплять классовые и экземплярные методы классов. В последнем случае процедурная переменная в полях объекта запоминает некоторое состояние, которое меняется между вызовами метода, связанного с этой процедурной переменной.
Пример
type
A = class
x0: integer := 1;
h: integer := 2;
procedurePrintNext;
begin
Print(x0);
x0 *= h;
end;
end;
begin
varp: procedure;
vara1 := new A();
p := a1.PrintNext;
for var i:=1 to 10 do
p;
// 1 2 4 8 16 32 64 128 256 512
end.
Подобное поведение гораздо проще реализовать с помощью захвата переменной лямбда-выражением:
begin
varx0 := 1;
varp: Action0 := procedure -> begin Print(x0); x0 *= 2 end;
for var i:=1 to 10 do
p;
end.
Файл представляет собой последовательность элементов одного типа, хранящихся на диске. В PascalABC.NETимеется два типа файлов - двоичные и текстовые . Текстовые файлы хранят символы, разделенные на строки символами #13#10 (Windows) и символом #10 (Linux). Последовательность символов для перехода на новую строку хранится в константе NewLine. Двоичные файлы в свою очередь делятся на типизированные и бестиповые.
Для описания текстового файла используется стандартное имя типа text, бестиповые файлы имеют тип file, а для описания типизированного файла используется конструкция file ofтип элементов:
var
f1: file ofreal;
f2: text;
f3: file;
В качества типа элементов в типизированном файле не могут фигурировать указатели, ссылочные типы, а также тип записи, содержащий ссылочные поля или указатели.
Стандартные файловые процедуры и функции описываются в пункте Процедуры и функции для работы с файлами.
Кроме того, в .NET имеется ряд классов, связанных с работой с файлами.
Эквивалентность и совместимость типов
Совпадение типов
Говорят, что типы T1 и T2 совпадают, если они имеют одно имя либо же определены в секции typeв виде T1 = T2. Таким образом, в описаниях
type
IntArray = array[1..10] ofinteger;
IntArrayCopy = IntArray;
var
a1: IntArray;
a2: IntArrayCopy;
b1,c1: array[1..15] ofinteger;
b2: array[1..15] ofinteger;
переменные a1 и a2 и переменные b1 и c1 имеют один и тот же тип, а переменные b1 и b2 - разные типы.
Эквивалентность типов
Говорят, что типы T1 и T2 эквивалентны, если выполняется одно из следующих условий:
* T1 и T2 совпадают
* T1 и T2 - динамические массивы с совпадающими типами элементов
* T1 и T2 - указатели с совпадающими базовыми типами
* T1 и T2 - множества с совпадающими базовыми типами
* T1 и T2 - процедурные типы с совпадающим списком формальных параметров (и типом возвращаемого значения - для функций)
Если типы эквивалентны только если их имена совпадают, то говорят, что имеет место именная эквивалентность типов . Если типы эквивалентны если они совпадают по структуре, то говорят, что имеет место структурная эквивалентность типов . Таким образом, в PascalABC.NETимеет место именная эквивалентность для всех типов, кроме динамических массивов, множеств, типизированных указателей и процедурных типов, для которых имеет место структурная эквивалентность типов.
Только если типы T1 и T2 эквивалентны, фактический параметр типа T1 может быть подставлен вместо формального параметра-переменной типа T2.
Совместимость типов
Говорят, что типы T1 и T2 совместимы, если выполняется одно из следующих условий:
Читать дальше