var a1 := 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
var x0 := 1;
var p: 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 of real;
f2: text;
f3: file;
В качества типа элементов в типизированном файле не могут фигурировать указатели, ссылочные типы, а также тип записи, содержащий ссылочные поля или указатели.
Стандартные файловые процедуры и функции описываются в пункте Процедуры и функции для работы с файлами.
Кроме того, в .NET имеется ряд классов, связанных с работой с файлами.
Эквивалентность и совместимость типов
Совпадение типов
Говорят, что типы T1 и T2 совпадают, если они имеют одно имя либо же определены в секции type в виде T1 = T2. Таким образом, в описаниях
type
IntArray = array [1..10] of integer;
IntArrayCopy = IntArray;
var
a1: IntArray;
a2: IntArrayCopy;
b1,c1: array [1..15] of integer;
b2: array [1..15] of integer;
переменные 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 совместимы, если выполняется одно из следующих условий:
* T1 и T2 эквивалентны
* T1 и T2 принадлежат к целым типам
* T1 и T2 принадлежат к вещественным типам
* Один из типов - поддиапазон другого или оба - поддиапазоны некоторого типа
* T1 и T2 - множества с совместимыми базовыми типами
Совместимость типов по присваиванию
Говорят, что значение типа T2 можно присвоить переменной типа T1 или тип T2 совместим по присваиванию с типом T1, если выполняется одно из следующих условий:
* T1 и T2 совместимы
* T1 - вещественного типа, T2 - целого
* T1 - строкового типа, T2 - символьного
* T1 - pointer, T2 - типизированный указатель
* T1 - указатель или процедурная переменная, T2=nil
* T1 - процедурная переменная, T2 - имя процедуры или функции с соответствующим списком параметров
* T1, T2 - классовые типы, один из них - наследник другого. Поскольку в PascalABC.NET все типы кроме указателей являются потомками типа Object, то значение любого типа (кроме указателей) можно присвоить переменной типа Object
* T1 - тип интерфейса, T2 - тип класса, реализующего этот интерфейс
Если тип T2 совместим по присваиванию с типом T1, то говорят также, что тип T2 неявно приводится к типу T1.
Стандартные типы PascalABC.NET реализуются типами библиотеки классов .NET. Далее приводится таблица соответствий стандартных типов PascalABC.NET и типов .NET.
Тип PascalABC.NET
Тип .NET
int64
System.Int64
uint64
System.UInt64
integer, longint
System.Int32
longword, cardinal
System.UInt32
BigInteger
System.BigInteger
smallint
System.Int16
word
System.UInt16
shortint
System.SByte
byte
System.Byte
boolean
System.Boolean
real
System.Double
double
System.Double
char
System.Char
string
System.String
object
System.Object
array of T
T[]
record
struct
Выражения и операции: обзор
Выражение - это конструкция, возвращающая значение некоторого типа. Простыми выражениями являются переменные и константы, например:
3.14
x
Более сложные выражения строятся из простых с помощью операций, вызовов функций и скобок. Данные, к которым применяются операции, называются операндами.
В PascalABC.NET имеются следующие операции: @, not, ^, *, /, div, mod, and, shl, shr, +, -, or, xor, =, >, <, <>, <=, >=, as, is, in, =>, а также операция new и операция приведения типа.
Операции @, -, +, ^, not, операция приведения типа и операция new являются унарными (имеют один операнд), остальные являются бинарными (имеют два операнда), операции + и - являются и бинарными и унарными.
Порядок выполенения операций определяется их приоритетом. В языке PascalABC.NET четыре уровня приоритетов операций, задаваемых таблицей приоритетов.
Для типов, определенных пользователем, ряд операций можно перегружать.
Справка по операциям PascalABC.NET
* Арифметические операции
* Логические операции
* Операции сравнения
* Строковые операции
* Побитовые операции
* Операции с множествами
* Операция явного приведения типов
* Операции is и as
* Операция new
* Операция @ получения адреса
* Операции с указателями
* Операции typeof и sizeof
К арифметическим относятся бинарные операции +, -, *, / для вещественных и целых чисел, бинарные операции div и mod для целых чисел и унарные операции + и - для вещественных и целых чисел. Тип выражения x op y, где op - знак бинарной операции +, - или *, определяется из следующей таблицы:
shortint
byte
smallint
word
integer
longword
int64
uint64
BigInteger
single
real
shortint
integer
integer
integer
integer
integer
int64
int64
uint64
BigInteger
single
real
byte
integer
integer
integer
integer
integer
longword
int64
uint64
BigInteger
single
real
smallint
integer
integer
integer
integer
integer
int64
int64
uint64
BigInteger
single
real
word
integer
integer
integer
integer
integer
longword
int64
uint64
BigInteger
single
real
integer
integer
integer
integer
integer
integer
int64
int64
uint64
BigInteger
single
real
longword
int64
longword
int64
longword
int64
longword
uint64
uint64
BigInteger