Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
Глава 1. Некоторые расширения Паскаля в языке PascalABC.NET 11 В PascalABC.NET предусмотрены также специальные средства для ввода и вывода массивов и последовательностей. Эти средства не имеют аналогов в традиционном Паскале; они будут описаны в главе 3, посвя- щенной соответствующим структурам. Часть подобных средств можно ис- пользовать и при выполнении заданий из электронного задачника, связан- ных с обработкой структур данных. 1.3. Лямбда-выражения Подобно большинству современных языков программирования, язык PascalABC.NET имеет средства для работы с лямбда-выражениями — со- здаваемыми «на лету» подпрограммами (функциями и процедурами), ко- торые можно либо сохранить в процедурных переменных, либо (что тре- буется гораздо чаще) передать в качестве параметров процедурного типа 1 . Синтаксис определения лямбда-выражений является чрезвычайно наглядным и кратким. Краткость достигается, прежде всего, за счет уже упоминавшегося ранее вывода типов, т. е. способности компилятора само- стоятельно определять типы, связанные с определяемым лямбда- выражением. Аналогичный синтаксис можно использовать при описании процедурных переменных, что также существенно повышает наглядность. Приведем пример. Опишем процедурную переменную f для хранения вещественных функций с одним вещественным параметром: var f: real -> real; После этого с переменной f можно связать лямбда-выражение, опреде- ляющее функцию возведения в куб: f := x -> x * x * x; Обратите внимание на то, что после «стрелки» -> сразу указывается возвращаемое значение. Тип параметра x указывать не требуется, так как он может быть выведен из описания переменной f. Операторы описания и инициализации можно объединить: var f: real -> real := x -> x * x * x; Теперь можно выполнять операцию возведения в куб, используя про- цедурную переменную f, например: Print(f(1), f(2), f(3)); // будет выведено 1 8 27 Если процедурная переменная или лямбда-выражение имеют несколь- ко параметров, то их, как обычно, надо заключать в скобки. Если проце- 1 В дальнейшем под словом «подпрограмма» будем подразумевать как функцию, так и процедуру (аналогичным образом, выражение «процедурный тип» традиционно ис- пользуется для типов, определяющих как процедуры, так и функции). 12 дурная переменная предназначена для хранения процедур (а не функций), то при ее описании после стрелки -> надо указать парные скобки (). Напри- мер, так выглядит определение процедурной переменной, с которой связы- вается лямбда-выражение для печати суммы двух целых чисел: var p: (integer, integer) -> () := (a, b) -> Print(a + b); p(2, 3); // будет выведено 5 Как правило, лямбда-выражения используются для оформления ко- ротких функций или процедур, состоящих из одного возвращаемого выра- жения или, соответственно, одного выполняемого оператора. Однако ни- что не препятствует описывать лямбда-выражения из нескольких операто- ров; в этом случае лишь требуется, как обычно, заключать эти операторы в операторные скобки begin-end, а для определения возвращаемого значения использовать стандартную переменную Result. Например, с переменной f можно связать следующее лямбда-выражение, которое не только вычисля- ет куб числа, но и печатает результат вычислений на экране: f := x -> begin var y := x * x * x; WritelnFormat('{0}*{0}*{0}={1}', x, y); Result := y; end; Данный фрагмент содержит также пример использования форматиру- ющей процедуры вывода WritelnFormat с простейшим вариантом форматной строки, в которой позиции выводимых данных помечаются как {0} и {1} (обратите внимание на то, что значение x будет указано в трех местах фор- матной строки). Теперь вызов оператора Print(f(1), f(2), f(3)); приведет к выводу следующего текста: 1*1*1=1 2*2*2=8 3*3*3=27 1 8 27 Здесь первые три строки выводятся внутри вызванных функций f, а возвращаемые ими значения печатаются в последней строке (которая вы- водится процедурой Print). Следует упомянуть еще одну важную особенность лямбда-выражений: возможность захвата переменных. В лямбда-выражении можно использо- вать не только параметры, но и внешние по отношению к этому выраже- нию переменные. Это часто оказывается удобным в ситуации, когда лямб- |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling