Пример «Лямбды и замыкания»
Файлы:
- Синтаксис языка
- Функции
- Лямбды и замыкания.перфо
- Функции
Пример программы на языке программирования Перфо:
//Эта программа написана на языке программирования Перфо
//для демонстрации замыканий при использовании лямбда-функций
//Лямбда-функция определяется в языке Перфо так же, как обычная функция,
//но без указания имени функции.
//Используется ключевое слово Функ.
//Создадим лямбда-функцию и сохраним ее в переменную МояЛямбда
(Перем МояЛямбда (Функ (А) (* А А)))
//вызовем лямбда-функцию хранящуюся в переменной
(Вывод "Моя лямбда = " (МояЛямбда 5) пс пс)
//Ответ: 25
//====== Замыкание ======
//создадим функцию возвращающую лямбда-функцию
(Функция (СоздатьЛямбду)
//переменная Ном определена вне лямбда-функции, но будет ею захвачена
(Перем Ном 0)
//лямбда-функция принимает один параметр
(Функ (А)
(Вывод Ном " " А " : ") //покажем, что мы имеем на входе лямбда-функции
//изменяем внешнюю переменную и возвращаем её
(Уст А (+ А 1))
(Уст Ном (+ Ном А))
(Ном)
)
)
//создадим две лямбда-функции, что бы показать,
//что каждая из них содержит свою копию захваченной переменной Ном
(Перем Л1 (СоздатьЛямбду))
(Перем Л2 (СоздатьЛямбду))
//вызываем несколько раз первую лямбда-функцию
(Вывод "Вызов лямбды Л1:" пс)
(Для (Инд 0 4)
(Вывод (Л1 Инд) ПС)
)
(Вывод ПС)
//вызываем несколько раз вторую лямбда-функцию
(Вывод "Вызов лямбды Л2:" пс)
(Для (Инд 10 14)
(Вывод (Л2 Инд) ПС)
)
(Вывод ПС)
//Результат:
//Вызов лямбды Л1:
//0 0 : 1
//1 1 : 3
//3 2 : 6
//6 3 : 10
//10 4 : 15
//Вызов лямбды Л2:
//0 10 : 11
//11 11 : 23
//23 12 : 36
//36 13 : 50
//50 14 : 65
//====== Используем лямбду как хранилище действий ======
// Допустим, что у нас есть функция:
// Ф(х,у) = х*(1+х*у)^2+у*(1?у)+(1+х*у)*(1?у)
// Мы можем представить её в виде
// двух вспомогательных выражений:
// А = (1+х*у)
// Б = (1?у)
// и основного выражения
// Ф(х,у) = х*А^2+у*Б+А*Б
(Функция (Ф1 х у)
(Перем А (+ 1 (* х у)))
(Перем Б (- 1 у))
//вычислим основное выражение
(+ (* х (* А А)) (* у Б) (* А Б))
)
//тест
(Вывод "Ф1(х,у) = " (Ф1 2 3) пс)
//Ответ: 78
// Перепишем с использованием вложенной функции:
(Функция (Ф2 х у)
//основное выражение оформим в виде функции
(Функция (Результат А Б)
(+ (* х (* А А)) (* у Б) (* А Б))
)
//вызовем функция передав ей вспомогательные выражения
(Результат (+ 1 (* х у)) (- 1 у))
)
//тест
(Вывод "Ф2(х,у) = " (Ф2 2 3) пс)
//Ответ: 78
// Перепишем с использованием лямбда-выражения:
(Функция (Ф3 х у)
( //эта пара скобок нужна, что бы сразу вызвать лямбда-выражение с параметрами
//т.к. лямбда-выражение становится вычисляемым идентификатором действия
//основное выражение оформим в виде лямбда-выражения
(Функ (А Б) (+ (* х (* А А)) (* у Б) (* А Б)))
//переддим лямбда выражению вспомогательные выражения
(+ 1 (* х у))
(- 1 у)
)
)
//тест
(Вывод "Ф3(х,у) = " (Ф3 2 3) пс)
//Ответ: 78
К началу статьи
Вернуться в раздел:
Примеры по языку Перфо
Перейти в раздел:
Примеры