Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet5/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   2   3   4   5   6   7   8   9   ...   71
Bog'liq
Abramyan-Pascal2016-1


Глава 1. Некоторые расширения Паскаля в языке PascalABC.NET 
13 
да-выражение требуется передавать в качестве параметра. Предположим
например, что имеется процедура Tab, которая выводит значения некото-
рой вещественной функции f, зависящей от одной вещественной перемен-
ной, в точках отрезка [a, b], разбивающих его на n равных частей (такое 
действие называется табуляцией функции f). Естественно ожидать, что ее 
заголовок будет иметь следующий вид (вариант реализации этой функции 
будет приведен далее, в п. 3.5): 
procedure Tab(f: real -> real; a, b: real; n: integer); 
Предположим далее, что мы хотим выполнить табуляцию функции, 
зависящей от дополнительного параметра (одного или нескольких), — 
например, квадратного трехчлена f(x) = ax
2
bx + c. Мы не можем исполь-
зовать лямбда-выражение, зависящее от четырех переменных (x, a, b, c), так 
как процедура Tab принимает только лямбда-выражения типа real -> real. 
Однако мы можем описать требуемое лямбда-выражение с параметром x
«захватив» в нем внешние переменные a, b, c: 
var a, b, c: real;
// при создании переменные a, b, c получат нулевые значения 
var f : real -> real; 
f := x -> a * x * x + b * x + c; 
a := 1; 
Tab(f, 0, 1, 10); // табуляция функции x * x 
b := -2; 
c := 1; 
Tab(f, 0, 1, 10); // табуляция функции (x - 1) * (x - 1) 
Необходимо подчеркнуть, что при вычислении функции f будут ис-
пользоваться те значения захваченных переменных, которые они имеют в 
момент вычисления функции (а не в момент ее определения).
1.4.
Кортежи 
Подобно тому как лямбда-выражения позволяют «на лету» создавать 
функции или процедуры для передачи их в подпрограммы или присваива-
ния процедурным переменным, кортежи (tuples) позволяют «на лету» со-
здавать составные наборы данных, аналогичные записям (records), исполь-
зуя при этом очень краткий и наглядный синтаксис.
Например, кортеж t, состоящий из двух полей, первое из которых име-
ет целый, а второе — строковый тип, можно описать следующим образом: 
var t: (integer, string); 
После этого переменной t можно присвоить значение, состоящее из 
полей указанных типов, также заключая эти поля в круглые скобки: 
t := (10, 'Sample'); 


14 
Поскольку по типу каждого выражения в правой части присваивания 
можно вывести тип кортежа, инициализацию переменной t можно выпол-
нить в момент ее описания, не указывая при этом ее тип: 
var t := (10, 'Sample'); 
Полям кортежа автоматически присваиваются имена Item1, Item2 и 
т. д.; кроме того, с ними связываются индексы, начиная от 0. Таким обра-
зом, для обращения к полям кортежа можно использовать либо точечную 
нотацию (например, t.Item1), либо индексированное выражение (например, 
t[0]). Однако индекс должен быть константным выражением (это необхо-
димо для того, чтобы компилятор уже на этапе компиляции смог опреде-
лить тип того поля, к которому выполняется обращение). 
Кортеж может содержать от 1 до 7 полей, причем поля тоже могут 
быть кортежами. 
Поля кортежа доступны только для чтения; изменять поля по отдель-
ности запрещено. Можно представлять себе кортеж как некоторую «замо-
роженную» сущность, которую нельзя изменять по частям. Однако изме-
нять кортеж как единое целое вполне допустимо; при этом для изменения, 
например, только первого из двух имеющихся полей можно использовать 
следующий оператор: 
t := (20, t.Item2); 
Важным средством работы с кортежами является так называемое кор-
тежное присваивание. Если в правой части оператора присваивания ука-
зывается кортеж, то в левой можно указать в круглых скобках через запя-
тую набор переменных, типы которых совпадают с типами полей кортежа, 
например (предполагаем, что переменная n имеет тип integer, а переменная 
s — тип string): 
(n, s) := t; 
В результате подобного присваивания в переменные, указанные в ле-
вой части, будут записаны значения соответствующих полей кортежа, ука-
занного справа. 
Интересным примером применения кортежного присваивания являет-
ся обмен значениями двух однотипных переменных a и b, который можно 
оформить в виде единственного оператора: 
(a, b) := (b, a); 
Кортежи позволяют наглядно записывать лямбда-выражения, возвра-
щающие не одно, а несколько значений. Например, допустимо описать 
процедурную переменную такого типа: 
var f: (integer, integer) -> (integer, integer); 


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling