Опубликован: 19.03.2004 | Уровень: специалист | Доступ: платный
Лекция 4:

Отображения и функционалы

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >

Встроенные функционалы (Clisp)

Отображающий функционал можно написать самим, а можно и воспользоваться одним из встроенных. Согласно стандарту, в реализацию языка Clisp обычно включены функционалы: MAP, MAPCAR, MAPLIST, MAPCAN, MAPCON, MAPC, MAPL [6, 7]. Каждый из них покомпонентно обработает любой набор списков. Отличаются они схемами выбора аргументов для отображающей функции, характером воздействия на исходные данные и оформлением результатов, передаваемых объемлющим формулам.

Map
( map result-type function sequences ... )

Функция FUNCTION вызывается на всех первых элементах последовательностей, затем на всех вторых и т.д. Из полученных результатов FUNCTION формируется результирующая последовательность, строение которой задается параметром RESULT-TYPE с допустимыми значениями CONS, LIST, ARRAY, STRING, NIL.

Mapcar
( mapcar funct list ... )

Функция FUNCTION применяется к первым элементам списков, затем ко вторым и т.д. Другими словами, FUNCTION применяется к ";головам" методично сокращающихся списков, и результаты применения собираются в результирующий список.

(mapcar #'+ '(1 2 3) '(4 5 6)) 
            ; = (5 7 9)
(mapcar #'list '(1 2 3)'(4 5 6)) 
            ; = ((1 4)(2 5)(3 6))
(DEFUN evlis (args) (mapcar #'EVAL args))
            ; вычисление аргументов
4.14.

(Без учета ассоциативного списка)

(DEFUN evlis (args AL) (mapcar #'(LAMBDA (x)
(EVAL x AL)) args))
Maplist
( maplist function list ... )

Функционал аналогичен MAPCAR, но FUNCTION применяется к "хвостам" списков LIST, начиная с полного списка.

(maplist #'list '(1 2 3)'(4 5 6))
      ; = (((1 2 3) (4 5 6)) ((2 3)
(5 6)) ((3) (6)))
4.15.
Mapc и Mapl

Оба функционала работают как MAPCAR и MAPLIST, соответственно, за исключением того, что они в качестве формального результата выдают первый список (своеобразная аналогия с формальными аргументами).

(mapc #'list '(1 2 3)'(4 5 6)) ; = (1 2 3)
(mapl #'list '(1 2 3)'(4 5 6)) ; = (1 2 3)
4.16.
Mapcan и Mapcon

И эти два функционала аналогичны MAPCAR и MAPLIST, но формирование результатов происходит не с помощью операции CONS, которая строит данные в новых блоках памяти, а с помощью деструктивной функции NCONC, которая при построении новых данных использует память исходных данных, из-за чего исходные данные могут быть искажены.

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

MAP-INTO отображает результат в конкретную последовательность.

Подведение итогов

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

  • отображающие функционалы позволяют строить программы из крупных действий ;
  • функционалы обеспечивают гибкость отображений ;
  • определение функции может совсем не зависеть от конкретных имен ;
  • с помощью функционалов можно управлять выбором формы результатов ;
  • параметром функционала может быть любая функция, преобразующая элементы структуры;
  • функционалы позволяют формировать серии функций от общих данных ;
  • встроенные в Clisp функционалы приспособлены к покомпонентной обработке произвольного числа параметров ;
  • любую систему взаимосвязанных функций можно преобразовать к одной функции, используя вызовы безымянных функций.
< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Алина Ленкова
Алина Ленкова
Россия, Ставрополь, СФ МГУПИ, 2014
Валерий Ромашов
Валерий Ромашов
Россия