Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet4/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 
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). 
Следует упомянуть еще одну важную особенность лямбда-выражений: 
возможность захвата переменных. В лямбда-выражении можно использо-
вать не только параметры, но и внешние по отношению к этому выраже-
нию переменные. Это часто оказывается удобным в ситуации, когда лямб-


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