W Cat - Описание языка PascalABC.NET
- Название:Описание языка PascalABC.NET
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
W Cat - Описание языка PascalABC.NET краткое содержание
PascalABC.NET — это язык программирования Паскаль нового поколения, включающий классический Паскаль, большинство возможностей языка Delphi, а также ряд собственных расширений. Он реализован на платформе Microsoft.NET и содержит все современные языковые средства: классы, перегрузку операций, интерфейсы, обработку исключений, обобщенные классы и подпрограммы, сборку мусора, лямбда-выражения, средства параллельного программирования.
PascalABC.NET является мультипарадигменным языком: на нем можно программировать в структурном, объектно-ориентированном и функциональном стилях.
PascalABC.NET — это также простая и мощная интегрированная среда разработки, поддерживающая технологию IntelliSense, содержащая средства автоформатирования, встроенный отладчик и встроенный дизайнер форм.
Описание языка PascalABC.NET - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Чтобы разрешить использование некоторых действий с переменными, имеющими тип параметра обобщенного класса или подпрограммы, используются ограничения на обобщенные параметры, задаваемые в секции whereпосле заголовка подпрограммы или класса:
type
MyPair = class
whereT: System.ICloneable;
private
x,y: T;
public
constructor(x,y: T);
begin
Self.x := x;
Self.y := y;
end;
functionClone: MyPair;
begin
Result := new MyPair(x.Clone,y.Clone);
end;
end;
В секции whereчерез запятую перечисляются следующие ограничения:
На 1 месте: слово classили слово recordили имя класса-предка.
На 2 месте: список реализуемых интерфейсов через запятую.
На 3 месте: слово constructor, указывающее, что данный тип должен иметь конструктор по умолчанию.
При этом каждое из мест, кроме одного, может быть пустым.
Для каждого типа-параметра может быть своя секция where, каждая секция where завершается точкой с запятой.
Пример.Обобщенная функция поиска минимального элемента в массиве. Элементы должны реализовывать интерфейс IComparable.
functionMinElem(a: array ofT): T;
whereT: IComparable;
begin
varmin: T := a[0];
for vari := 1 toa.Length-1 do
ifmin.CompareTo(a[i])<0 then
min := a[i];
Result := max;
end;
К сожалению, нет возможности использовать операцию <, поскольку операции не входят в интерфейсы.
Элементы функционального программирования
Лямбда-выражения
Лямбда-выражение - это выражение специального вида, которое на этапе компиляции заменяется на имя подпрограммы, соответствующей лямбда-выражению и генерируемой компилятором на лету.
Здесь излагается полный синтаксис лямбда-выражений.
Здесь рассказывается о захвате лямбда-выражением переменных из внешнего контекста.
Лямбда-выражения запрещается использовать при инициализации полей класса или записи, внутри вложенных подпрограмм, в подпрограмме при наличии вложенной подпрограммы, в разделе инициализации модуля.
Синтаксис лямбда-выражений достаточно сложен и в данном пункте иллюстрируется на примерах.
Пример 1.
varf: integer -> integer := x -> x*x;
f(2);
Запись x -> x является лямбда-выражением, представляющем собой функцию с одним параметром x типа integer, возвращающую x*x типа integer. По данной записи компилятор генерирует следующий код:
function#fun1(x: integer): integer;
begin
Result := x*x;
end;
...
varf: integer -> integer := #fun1;
f(2);
Здесь #fun1 - это имя, генерируемое компилятором. Кроме того, код функции #fun1 также генерируется компилятором.
Пример 2. Фильтрация четных
Обычно лямбда-выражение передаётся как параметр подпрограммы. Например, в следующем коде
var a := Seq(3,2,4,8,5,5);
a.Where(x -> x mod 2 = 0).Print;
лямбда-выражение x -> x mod 2 = 0 задаёт условие отбора чётных чисел из массива a.
Пример 3. Сумма квадратов
var a := Seq(1,3,5);
writeln(a.Aggregate(0,(s,x)->s+x*x));
Иногда необходимо явно задавать тип параметров в лямбда-выражении.
Пример 4. Выбор перегруженной версии процедуры с параметром-лямбдой.
procedure p(f: integer -> integer);
begin
write(f(1));
end;
procedure p(f: real -> real);
begin
write(f(2.5));
end;
begin
p((x: real)->x*x);
end.
В данном примере вызов p(x -> x) вызовет ошибку компиляции, потому что компилятор не может выбрать, какую версию процедуры p выбирать. Задание типа параметра лямбды помогает устранить эту неоднозначность.
Пример 5. Лямбда-процедура.
procedure p(a: integer -> ());
begin
a(1)
end;
begin
p(procedure(x) -> write(x));
end.
Захват переменных в лямбда-выражении
Лямбда-выражение может использовать переменные из внешнего контекста. Такие переменные называются захваченными лямбда-выражением.
Пример 1. Захват переменной в запросе Select.
begin
var a := Seq(2,3,4);
var z := 1;
var q := a.Select(x->x+z);
q.Println;
z := 2;
q.Println;
end.
Здесь лямбда-выражение x->x+z захватывает внешнюю переменную z. Важно заметить, что при изменении значения переменной z запрос a.Select(x->x+z), хранящийся в переменной q, выполняется с новым значением z.
Пример 2. Накопление суммы во внешней переменной.
begin
var sum := 0;
var AddToSum: integer -> () := procedure (x) -> begin sum += x; end;
AddToSum(1);
AddToSum(3);
AddToSum(5);
writeln(sum);
end.
Методы последовательностей
Все последовательности имеют множество методов обработки последовательностей, реализованных как методы расширения.
* Методы Print
* Метод фильтрации Where
* Метод проецирования Select
* Метод проецирования SelectMany
* Методы Take, TakeWhile, Skip, SkipWhile
* Метод Sorted
* Методы OrderBy, OrderByDescending
* Методы ThenBy,ThenByDescending
* Метод ForEach
* Метод Concat
* Метод JoinIntoString
* Метод Zip
* Метод Distinct
* Методы Union,Intersect,Except
* Метод Reverse
* Метод SequenceEqual
* Методы First, FirstOrDefault
* Методы Last, LastOrDefault
* Методы Single, SingleOrDefault
* Метод DefaultIfEmpty
* Методы ElementAt, ElementAtOrDefault
* Методы Any, All
* Методы Count
* Метод Contains
* Метод Aggregate
* Методы Sum, Average
* Методы Min, Max
* Метод Join
* Метод GroupJoin
* Метод GroupBy
* Метод AsEnumerable
* Методы ToArray, ToList
* Метод ToDictionary
* Метод ToLookup
* Метод OfType
* Метод Cast
Методы для последовательностей
Методы Print
Методы приведены для последовательности sequence ofT.
functionPrint(delim: string := ' '): sequence ofT; Выводит последовательность на экран, используя delim в качестве разделителя. |
functionPrintln(delim: string := ' '): sequence ofT; Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку. |
Метод фильтрации Where
Методы приведены для последовательности sequence ofT.
functionWhere(predicate: T->boolean): sequence ofT; Выполняет фильтрацию последовательности значений на основе заданного предиката. Возвращает подпоследовательность значений исходной последовательности, удовлетворяющих предикату. |
functionWhere(predicate: (T,integer)->boolean): sequence ofT; Выполняет фильтрацию последовательности значений на основе заданного предиката с учётом индекса элемента. Возвращает подпоследовательность значений исходной последовательности, удовлетворяющих предикату. |
Метод проецирования Select
Методы приведены для последовательности sequence ofT.
functionSelect(selector: T->Res): sequence ofRes; |
Интервал:
Закладка: