23. Безымянные функции
Определения в примерах 4.4 и 4.5 не вполне удобны по следующим причинам:
в определениях целевых функций duble и sqware встречаются имена специально определенных вспомогательных функций;
формально эти функции независимы, значит, программист должен отвечать за их наличие при использовании целевых функций на протяжении всего жизненного цикла программы, что трудно гарантировать;
вероятно, имя вспомогательной функции будет использоваться только один раз - в определении целевой функции.
С одной стороны, последнее утверждение противоречит пониманию смысла именования как техники, обеспечивающей неоднократность применения поименованного объекта. С другой стороны, придумывать подходящие, долго сохраняющие понятность и соответствие цели, имена - задача нетривиальная.
Учитывая это, было бы удобнее вспомогательные определения вкладывать непосредственно в определения целевых функций и обходиться при этом вообще без имен. Конструктор функций lambda обеспечивает такой стиль построения определений. Этот конструктор любое выражение expr превращает в функцию с заданным списком аргументов (x1. .. xK) в форме так называемых lambda-выражений:
(lambda (x1 ... xK) expr)
Имени такая функций не имеет, поэтому может быть применена лишь непосредственно. DEFUN использует данный конструктор, но требует дать функциям имена.
Определение функций duble и sqware из примеров 4.4 и 4.5 без использования имен и вспомогательных функций:
(defun sqware (xl)
(map-el #' (lambda (x) (* x x)) xl))
(defun duble (xl)
(map-el #' (lambda (x) (cons x x)) xl))
Пример 4.9. (html, txt)
Любую систему взаимосвязанных функций можно преобразовать к одной функции, используя вызовы безымянных функций.
- 2. Алгоритмы унификации
- 3. Структура пролог-программы
- Раздел описания доменов (типов).
- Раздел описания предикатов внутренней базы данных
- Раздел описания предикатов
- Раздел описания предложений
- Раздел описания внутренней цели
- 4. Организация повторов
- 8. Сортировка списков
- 9. Выборка элементов из списков
- 10. Слияние списков
- 11. Множества в прологе
- 12. Реализация деревьев в прологе
- 13. Функциональный подход программирования.
- 14. Методы обработки списков (лисп).
- 15. Определение универсальной функции.
- 16. Предикаты и истинность в лиспе.
- 17. Отображения и функционалы
- Отображения структур данных и функционалы
- 18. Имена, определения и контексты в лисп
- 19. Prog выражения и циклы в лисп Свойства атомов и категории функций
- Prog-выражения и циклы
- 20. Списки свойств атомов и структура списков
- Представление структуры списка
- 21. Числа и мультиоперации
- 22. Функционалы - общее понятие.
- 23. Безымянные функции
- 24. Экспертные системы. Реализация в пролог и лисп