Лямбда-функции
Лямбда-функции в Scheme являются анонимными функциями, то есть функциями без имени. Эти функции определяются в строке и обычно используются для коротких одноразовых операций. Конструкция lambda — мощный инструмент функционального программирования, позволяющий на лету создавать краткую и гибкую логику.
Лямбда-функции особенно полезны, когда:
- Вам нужна небольшая функция для конкретной временной цели.
- Передача функций в качестве аргументов функциям более высокого порядка, например
map,filterилиfold. - Возврат функций из других функций.
Синтаксис лямбда-функций
Лямбда-функции могут быть определены самостоятельно…
(lambda (parameter1 parameter2 ...)
body-expression)…или вызывается немедленно:
((lambda (parameter1 parameter2 ...)
body-expression)
argument1 argument2 ...)parameter1, parameter2, ...: Параметры, которые принимает функция.body-expression: Логика, выполняемая при вызове функции.- Немедленный вызов: Вторая форма показывает, что лямбда-выражение вызывается немедленно с аргументами.
Примеры лямбда-функций
Использование Lambda для простых вычислений
((lambda (x y) (+ x y)) 3 5) ; Returns 8Здесь:
- Создана лямбда-функция для сложения двух чисел (
xиy). - Функция вызывается немедленно с аргументами
3и5.
Встроенные лямбда-функции
В следующем примере показано, как использовать for-each как с именованной функцией, так и с лямбда-функцией:
Использование именованной функции:
(define (print-item x)
(lumi-message (number->string x)))
(for-each print-item (list 1 2 3 4))- Объяснение:
print-item— это именованная функция, которая преобразует число в строку (number->string) и печатает ее с помощьюlumi-message.for-eachприменяетprint-itemк каждому элементу в списке(1 2 3 4).
Выход: 1 2 3 4
Использование лямбда-функции:
Ту же логику можно записать встроенно с помощью лямбда-функции, избегая необходимости в отдельной именованной функции:
(for-each (lambda (x) (lumi-message (number->string x)))
(list 1 2 3 4))- Объяснение:
(lambda (x) (lumi-message (number->string x)))определяет анонимную функцию.- Эта функция применяется к каждому элементу списка
(1 2 3 4)for-each.
Выход: 1 2 3 4
Лямбда-функции как аргументы
Лямбда-функции часто передаются непосредственно функциям более высокого порядка, например map или filter.
Возведение в квадрат списка чисел
(map (lambda (x) (* x x)) '(1 2 3 4)) ; Returns (1 4 9 16)- Функция
lambdaвозводит в квадрат каждый элемент списка. - Функция
mapприменяетlambdaк каждому элементу.
Лямбда-функции как возвращаемые значения
Вы можете вернуть лямбда-функцию из другой функции, чтобы создать динамическое поведение.
Генерация суммирующей функции
(define (make-adder n)
(lambda (x) (+ x n)))
(define add5 (make-adder 5))
(add5 10) ; Returns 15make-adderгенерирует новую лямбда-функцию, которая добавляет определенное число (n).- Возвращенная лямбда-выражение сохраняется в
add5, что добавляет5к ее входным данным.
Использование Lambda с let
Лямбды часто используются с let для создания временных функций с локальной областью действия.
Локальная лямбда для добавления
(let ((add (lambda (a b) (+ a b))))
(add 3 4)) ; Returns 7letсвязывает лямбда-функцию с именемadd.- Затем лямбда используется как обычная функция в области
let.
Объединение лямбда-выражений с функциями высшего порядка
Лямбда-выражения превосходны в сочетании с функциями более высокого порядка для выполнения сложных преобразований данных.
Фильтрация четных чисел
(filter (lambda (x) (= (modulo x 2) 0)) '(1 2 3 4 5 6)) ; Returns (2 4 6)
```- `lambda` проверяет, является ли число четным.
- Функция `filter` использует лямбду для сохранения только четных чисел из списка.
### Преимущества лямбда-функций
– **Краткость.** Лямбда-выражения сокращают шаблонный код, устраняя необходимость определять отдельные именованные функции.
- **Гибкость.** Вы можете определять и использовать их там, где они необходимы, что делает код более модульным.
– **Улучшенная читабельность.** Для коротких конкретных задач лямбды проясняют цель, не загромождая код дополнительными именованными функциями.
### Когда использовать лямбда-функции
Используйте лямбда-функции, когда:
- Логика короткая и самостоятельная.
- Функция необходима только временно или в определенных пределах.
- Вы работаете с функциями более высокого порядка, такими как `map`, `filter` или `reduce`.
Избегайте использования лямбда-выражений для сложной многострочной логики, поскольку это может ухудшить читаемость. Для более обширных операций вместо этого используйте именованную функцию.
### Заключение
Лямбда-функции в Scheme предоставляют краткий и мощный способ определения анонимных функций для конкретных задач. Их гибкость и простота использования делают их важным инструментом для любого программиста Scheme. Понимание того, как эффективно использовать `lambda`, поможет вам писать более чистые, модульные и эффективные сценарии.