Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие Функциональное и логическое программирование.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
310 Кб
Скачать
☆

Функции более высокого порядка.

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

Основываясь на принятом в Лиспе едином представлении данных и программ, аргументами функций могут быть функции.

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

Различие понятий «данные» и «функция» определяется не на основе их структуры, а в зависимости от их использования. Если аргумент используется в функции лишь как объект, участвующий в вычислениях, то это обыкновенный аргумент, представляющий собой данные. Если же аргумент используется как средство, определяющее вычисления, применяемые к другим аргументам, то это функциональный аргумент. Таким образом, одно и то же выражение может выступать и как обыкновенный аргумент, и как функциональный. Роль и интерпретация выражения зависят от его синтаксической позиции.

Примеры.

1). (car '(lambda (x) (list x))) => LAMBDA

2). ((lambda (x) (list x)) 'car) => (CAR)

В первом примере s-выражение (lambda (x) (list x)) является аргументом функции - обычным списком; во втором – выражением, задающим вычисления.

Функциональным объектом может быть:

1) символьное имя, представляющее определение функции (системной или определенной пользователем);

2) безымянное лямбда-выражение;

3) замыкание.

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

‘(lambda (x) (list x))…

…(list ‘lambda ‘(x) (list ‘list ‘x))…

Функцию и функционал, результатом которых является функция, называются функцией или функционалом с функциональным значением. Вызов такого функционала возвращает в качестве результата новую функцию, в построении которой, возможно, используются функции, получаемые функционалом в качестве аргументов.

Получающий себя в качестве аргумента функционал называют автоаппликативной функцией. Функцию, возвращающую саму себя, называют авторепликативной.

Применяющие функционалы.

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

Рассмотрим применяющие функционалы APPLY и FUNCALL.

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

(APPLY fn список).

Примеры.

(APPLY ‘+ ‘(4 5 6)) => 15

(apply 'car '((1 2 3))) => 1

(apply 'list '(1 2 3)) => (1 2 3)

(defun f (x)

(cond ((null x) 'end)

(t (print (apply (car x) '(2 3))) (f (cdr x))))) => F

(f '(+ - * /))

=> 5

=> -1

=> 6

=> 2/3

=> END

Использование APPLY дает большую гибкость по сравнению с прямым вызовом функции: в зависимости от функционального аргумента можно осуществлять различные вычисления.

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

(FUNCALL fn x1 x2 ... xn).

Пример.

(FUNCALL ‘+ 4 5 6) => 15

FUNCALL и APPLY позволяют задавать вычисления (функцию) произвольной формой, например, как в вызове функции, или символом, значением которого является функциональный объект. Таким образом, появляется возможность использовать синонимы имени функции. С другой стороны, имя функции можно использовать как обыкновенную переменную, например для хранения другой функции (имени или лямбда-выражения), и эти два смысла (значение и определение) не будут мешать друг другу:

(SETQ list ‘+) => +

(FUNCALL list 1 2) => 3

(LIST 1 2) => (1 2)