
- •Декларативные и императивные языки.
- •Стандартизация языков программирования
- •Типы данных
- •Структуры данных
- •Парадигма программирования
- •Способы реализации языков
- •Языки функционального программирования
- •Создание универсального функционального языка.
- •3. Символьная обработка и искусственный интеллект.
- •4. Применение искусственного интеллекта.
- •5. Основы языка лисп (6 – 15 вопросы)
- •6. Символы и списки
- •7. Понятие функции
- •8. Базовые функции Лиспа.
- •9. Имя и значение символа Лиспа.
- •10. Определение функций Лиспа.
- •11. Передача параметров в область их действия Лиспа.
- •11. Вычисления в Лиспе.
- •13 . Внутреннее представление списков в Лиспе
- •14. Свойства символа Лиспа.
- •15. Ввод и вывод в Лиспе.
- •16.Основы рекурсии.
- •17.Простая рекурсия.
- •18.Другие виды рекурсии.
- •19.Функции более высокого порядка.
- •20.Применяющие функционалы.
- •21.Отображающие функционалы.
- •22.Замыкания.
- •23.Абстрактный подход в Лиспе.
- •24.Макросы.
- •25.Понятия. Числа. Символы. Списки. Строки. Последовательности. Массивы. Структуры.
- •26.Развитие языка лисп и лисп-системы. История лисПа. Лисп-системы. Лисп-машины.
20.Применяющие функционалы.
Одним из основных типов функционалов являются функции, которые позволяют вызывать другие функции, иными словами, применять функциональный аргумент к его параметрам. Такие функционалы называют применяющими или аппликативными функционалами .
Применяющие функционалы родственны универсальной функции Лиспа EVAL. Применяющие функционалы дают возможность интерпретировать и преобразовывать данные в программу и применять ее в вычислениях.
APPLY является функцией двух аргументов, из которых первый аргумент представляет собой функцию, которая применяется к элементам списка, составляющим второй аргумент функции APPLY:
Использование APPLY дает большую гибкость по сравнению с прямым вызовом функции: с помощью одной и той же функции APPLY можно в зависимости от функционального аргумента осуществлять различные вычисления.
Функционал FUNCALL по своему действию аналогичен APPLY, но аргументы для вызываемой функции он принимает не списком, а по отдельности:
Пример:
FUNCALL и APPLY позволяют задавать вычисления (функцию) произвольной формой, например, как в вызове функции, или символом, значением которого является функциональный объект. В обыкновенном вызове функции можно использовать лишь символ, связанный DEFUN с лямбда-выражением. Интерпретация имени зависит от синтаксической позиции.
21.Отображающие функционалы.
Важный класс функционалов в практическом программировании на языке Лисп образуют отображающие функции или МАР-функции. МАР-функционалы являются функциями, которые некоторым образом отображают список в новую последовательность или порождают побочный эффект, связанный с этой последовательностью. Имена МАР-функций начинаются на MAP, и их вызов имеет вид
Здесь l1 ... lN - списки, a fn- функция от N аргументов. Как правило, МАР-функция применяется к одному аргументу-списку, т.е. fn является функцией от одного аргумента:
Существуют два основных типа МАР-функций. Одни из них применяют функциональный аргумент fn таким образом, что его аргументами будут последовательные CAR аргумента-списка (иными словами, fn применяется к элементам списка). Другие применяют функциональный аргумент к последовательным CDR списка. Результатом этих повторяющихся вычислений будет список, состоящий из результатов последовательных применений функции. Кроме того, функции отличаются друг от друга способом формирования результата. Во всех случаях число аргументов-списков должно совпадать с числом аргументов применяемой для вычислений функции.
Рассмотрим основные типы МАР-функций.
Значение функции MAPCAR вычисляется путем применения функции fn к последовательным элементам xi списка, являющегося вторым аргументом MAPCAR. Например, в случае одного списка получается следующее соответствие:
В качестве значения функционала возвращается список, построенный из результатов вызовов функционального аргумента MAPCAR. Приведем пример:
MAPLIST действует подобно MAPCAR, но действия осуществляются не над элементами списка, а над последовательными CDR (начиная с самого исходного списка) этого списка:
Функционалы MAPCAR и MAPLIST используются для программирования циклов специального вида и в определении других функций, поскольку с их помощью можно сократить запись повторяющихся вычислений.
Функции MAPCAN и MAPCON являются аналогами функций MAPCAR и MAPLIST. Отличие состоит в том, что MAPCAN и MAPCON не строят, используя LIST, новый список из результатов, а объединяют списки, являющиеся результатами, в один список, используя структуро-разрушающую псевдофункцию NCONC.
Функции МАРС и MAPL также аналогичны функциям MAPCAR и MAPLIST, но отличаются от них и от функций MAPCAN и MAPCON тем, что не собирают и не объединяют результаты. Возникающие результаты просто теряются. В качестве значения возвращается значение второго аргумента функции:
Вызовы функционалов можно объединять в более сложные структуры таким же образом, как и вызовы функций, а их композицию можно использовать в определениях новых функций.
Приведем в виде таблицы МАР-функции, предназначенные для аргументов, записанных в виде списков.
У всех функций первый аргумент - функциональный. Если это функция более чем от одного аргумента, то после функционального аргумента следует соответствующее количество аргументов-списков. Если списки различаются по длине, то количество повторений определяется длиной наиболее короткого списка.
Это традиционные функционалы, определенные для списков.