Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Функции с функциональным результатом вычислений и частичные вычисления

Замыкание можно трактовать как функцию, вычисление которой выполнено частично, окончательное вычисление функции отложено на момент ее вызова.

Пример

(defun remainder_x (x) (function (lambda (y) (rem y x))))

Функция rem вычисляет остаток от деления y на x. Функция remainder_x возвращает в качестве результата функцию, которая настроена на вычисление остатка от деления параметра на заданное число.

Пример

(funcall (remainder_x 2) 3) –> 1

(eval (list (remainder_x 2) 3)) -> 1

(setq rem_5 (remainder_x 5)) -> (LEXICAL_CLOSURE…)

;; переменная rem_5 связана с замыканием

(setq y 6) –> 6

(funcall rem_5 y) -> 1

Функциональные абстракции

Функциональные абстракции реализуются на основе:

  • определения функционалов с функциональными аргументами,

  • параметризованных функций, возвращающих функциональное значение.

Абстракции на основе функционалов. Сходные по структуре программы функции заменяются функционалом. Параметр определяет требуемый тип обработки.

Пример

(defun copy_list (x) ;; копирование списка

(if (null x) x

(cons (car x) (copy_list (cdr x)))) )

(defun append (x y) ;; объединение списков

(if (null x) y

(cons (car x) (append (cdr x) y))) )

(defun sort_app (x y) ;; объединение сортированных списков

(if (null x) y

(insert (car x) (sort_app (cdr x) y))) )

В представленных выше функциях выделяется общая часть – форма if и отличия, - вызов cons или insert. Определим функционал следующим образом:

(defun abst_fun (x y fn) ;; абстрактный функционал

(if (null x) y

(funcall fn (car x) (abst_fun (cdr x) y fn))) )

Применение функционала:

(setq lst1 ‘(d e k)) -> (d e k)

(abst_fun lst1 ‘(a b c) ‘insert) -> (a b c d e k)

(abst_fun ‘(4 10 6) nil ‘cons) -> (4 10 6)

Во втором случае применения abst_fun происходит простое копирование списка, поскольку 2-й аргумент nil.

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

Пример

Функция comptn возвращает в качестве результата ее аппликации композицию функций:

(defun comptn (f g)

#’(lambda (x)

(funcall f (funcall g x)))

) -> comptn

(setq ff ‘comptn) -> comptn

Применим функцию comptn в выражении для вычислений:

(funcall (comptn ‘add_1 ‘reverse) ‘(1 2 3)) -> (4 3 2),

или (funcall (funcall ff ‘add_1 ‘reverse) ‘(1 2 3)) -> (4 3 2),

где add_1 и reverse, соответственно, увеличивает числовые значения списка на 1 и обращает список.

Автофункции

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

Автоаппликативные функции

Автоаппликативные функции находят применение в функциональном программировании.

Пример

(defun rev (lst) (reverse ‘reverse lst nil))

(defun reverse (fn lst rez)

(if (null lst) rez

(funcall fn fn (cdr lst) (cons (car lst) rez))))

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

Автореппликативные функции

Автореппликативные функции рассматриваются только теоретически (как представления неопределенных значений).

Процедурное программирование

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]