Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория новая.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
129 Кб
Скачать
☆
  1. Функции более высокого порядка. Применяющие и отображающие функционалы.

в Лиспе принята единообразная скобочная форма записи S-выражений, что позволяет сделать вывод, что смысл любого выражения зависит от его контекста. Другими словами, одно и то же выражение в одном случае может выступать как данное, а в другом – как функция.

Аргумент функции, значением которого является функция, называется функциональным аргументом, а функция, имеющая функциональный аргумент – функционалом. Функция, которая возвращает в качестве результата другую функцию, называется функцией с функциональным значением.

Одним из основных классов функционалов являются те, которые применяют функциональный аргумент к параметрам. Такие функционалы называются применяющими. Они родственны универсальной функции Лиспа – EVAL, которая вычисляет значение произвольной формы, а не только функции. В Лиспе имеются применяющие функционалы APPLY и FANCALL.

Формат функционала APPLY следующий:

(apply fn list),

где fn – функция; list – список аргументов, к которому применяется функция.

Например,

> (apply '* '(2 3))

6

>.

Следующий применяющий функционал – FUNCALL по своему действию аналогичен APPLY, но аргументы для вызываемой функции получает не списком, а по отдельности. Его формат следующий:

(funcall fn ar1 ar2 … arn).

Можно сказать, что он применяет функцию к последовательности аргументов, например,

> (funcall '+ 2 3)

5.

Отображающие функционалы определенным образом отображают список (последовательность) в новую последовательность или порождают побочный эффект, связанный с исходной последовательностью

Различают два вида MAP-функционалов, первый из которых применяет функциональный аргумент к CAR-последовательностям списка, а второй – к CDR-последовательностям. Наиболее распространенные из MAP-функционалов – MAPCAR и MAPLIST.

Формат MAPCAR следующий:

(mapcar fn ’(ar1 ar2 … arn)).

Функционал работает следующим образом: вначале применяется функция к CAR-элементу, затем к CADR-элементу и так далее, до конца списка. Результатом функции будет являться список результатов от применения функционального аргумента ко второму параметру MAPCAR, например,

(mapcar 'atom '(a s d f))

(T T T T).

Для работы хвостовыми частями списков используют функционал MAPLIST, его формат следующий:

(maplist fn list),

где – fn – функциональный аргумент;

– list – список.

MAPLIST работает подобно MAPCAR, но только не над элементами списка, а над CDR-последовательностями списка, причем исходно полагается, что исходный список является собственным хвостом. Например,

>(maplist 'cdr '(a b c))

((B C) (C) NIL).

Разновидностью MAPCAR и MAPLIST являются функционалы MAPCAN и MAPCON, которые строят новые списки из результатов, используя структуроразрушающую функцию NCONC.

Примеры использования этих функционалов:

> (mapcon 'reverse '(a s d))

(D S A D S D)

>(mapcan '(lambda(n)((minusp n))(list n)) '(3 -7 4 0 -5 1))

  1. Замыкания.

Замыкание - это связь свободных переменных в некотором контексте.

Замыкание - это функция и контекст его применения. Сформированный на время вычисления контекст после окончания ее вычисления пропадает, и на него невозможно позже сослаться или вернуться к нему. Часто бывает полезным и необходимым, чтобы функция для продолжения вычислений могла запомнить связи и состояние более раннего контекста. Это достигается с помощью таких функциональных объектов, в которых вместе с самим описанием вычислений сохраняется контекст момента определения функционального объекта, защищённый от более позднего контекста вызова. Пару, состоящую из функции (лямбда-выражения) и контекста, называют замыканием или лексическим замыканием. Замыкание, как и имя функции или лямбда-выражение, можно использовать в качестве функционального аргумента

> (defun generate-even (*evenum*)

(function

(lambda()

(setq *evenum* (+ *evenum* 2)))))

> (setq gen-even-1 (generate-even 0))

> (funcall gen-even-1)

2

> (funcall gen-even-1)

4

> (funcall gen-even-1)

6