/
n-dimens
/
pascalabcnet
Обзор
Документация
Войти
/
n-dimens
/
pascalabcnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PABCNetHelp/LangGuide/FuncProgramming/lambdas.html
72 строки
5 KB
samuraiGH
adding working-tree-encoding attribute (#3325)
07 ноя 2025, 16:12
Не верифицирован
07 ноя 2025, 16:12
cf1fd29
Код
Авторство
О чём код?
<html> <head> <object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e"> <param name="Keyword" value=""> </object> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title></title> <link rel="StyleSheet" href="../../default.css"> <style type="text/css"> .auto-style1 { font-family: monospace; font-size: 10pt; color: #000080; } </style> </head> <body> <H1>Лямбда-выражения</H1> <p>Лямбда-выражение - это выражение специального вида, которое на этапе компиляции заменяется на имя подпрограммы, соответствующей лямбда-выражению и генерируемой компилятором "на лету". </p> <p>Здесь излагается полный <a href="lambdasyntax.html">синтаксис лямбда-выражений</a>.</p> <p>Здесь рассказывается о <a href="capture_variables.html">захвате лямбда-выражением переменных</a> из внешнего контекста.</p> <p>Лямбда-выражения запрещается использовать при инициализации полей класса или записи, внутри вложенных подпрограмм, в подпрограмме при наличии вложенной подпрограммы, в разделе инициализации модуля.</p> <p>Лямбда-выражения запрещается использовать совместно с метками label и оператором goto в одной подпрограмме.</p> <p>Синтаксис лямбда-выражений достаточно сложен и в данном пункте иллюстрируется на примерах. </p> <p><strong>Пример 1.</strong></p> <blockquote><code><b>var </b>f: integer -> integer := x -> x*x;<br>f(2);</code></blockquote> <p>Запись <span class="auto-style1">x -> x</span> является лямбда-выражением, представляющем собой функцию с одним параметром <span class="auto-style1">x</span> типа <span class="auto-style1">integer</span>, возвращающую <span class="auto-style1">x*x</span> типа <span class="auto-style1">integer</span>. По данной записи компилятор генерирует следующий код:</p> <blockquote><code><b>function</b> #fun1(x: integer): integer;<br><strong>begin<br> </strong> Result := x*x;<br><strong>end;<br>...<br></strong><b>var </b> f: integer -> integer := #fun1;<br>f(2);</code></blockquote> <p>Здесь <code>#fun1</code> - это имя, генерируемое компилятором. Кроме того, код функции <code>#fun1</code> также генерируется компилятором. </p> <p><strong>Пример 2. </strong>Фильтрация четных</p> <p>Обычно лямбда-выражение передаётся как параметр подпрограммы. Например, в следующем коде </p> <blockquote><code><strong>var</strong> a := Seq(3,2,4,8,5,5);<br>a.Where(x -> x <strong>mod</strong> 2 = 0).Print;</code></blockquote> <p>лямбда-выражение <code>x -> x <strong>mod</strong> 2 = 0</code> задаёт условие отбора чётных чисел из массива a.</p> <p><strong>Пример 3. </strong>Сумма квадратов</p> <blockquote><code><strong>var</strong> a := Seq(1,3,5);<br> writeln(a.Aggregate(0,(s,x)->s+x*x));</code></blockquote> <p>Иногда необходимо явно задавать тип параметров в лямбда-выражении. </p> <p><strong>Пример 4.</strong> Выбор перегруженной версии процедуры с параметром-лямбдой.</p> <blockquote><code><strong>procedure</strong> p(f: integer -> integer);<br> <strong>begin</strong><br> write(f(1));<br><strong>end</strong>;<br> <br><strong>procedure</strong> p(f: real -> real);<br><strong>begin</strong><br> write(f(2.5));<br><strong>end</strong>;<br><br><strong>begin</strong><br> p((x: real)->x*x);<br><strong>end</strong>.</code></blockquote> <p>В данном примере вызов p(x -> x) вызовет ошибку компиляции, потому что компилятор не может выбрать, какую версию процедуры p выбирать. Задание типа параметра лямбды помогает устранить эту неоднозначность.</p> <p><strong>Пример 5.</strong> Лямбда-процедура.</p> <blockquote><code><strong>procedure</strong> p(a: integer -> ());<br><strong> begin</strong><br> a(1)<br><strong>end</strong>;<br><br><strong>begin</strong><br> p(procedure(x) -> write(x));<br><strong>end</strong>.</code></blockquote> </body> </html>