Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
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); |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling