На этом шаге мы введем понятие объединяющих функционалов.
Функция:
(MAPCAN FUNC LIST1 ... LISTN)
выполняет действия, указанные в функции FUNC, над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-элементами каждого списка, и т.д. до тех пор, пока каждый из списков не будет исчерпан. Функция MAPCAN "связывает" свои результаты, используя функцию NCONC.
Функционал MAPCAN удобен для выборки нежелательных элементов из списка.
В приведенном примере показано, как можно удалить из списка отрицательные числа:
$ (MAPCAN '(LAMBDA (N) ( (MINUSP N)) (LIST N))
'(3 -7 4 0 -5 1))
(3 4 0 1)
Функция:
(MAPCON FUNC LIST1 ... LISTN)
выполняет действия, указанные в функции FUNC, над CAR-элементами списков
LIST1,...,LISTN, затем - над CDR-элементами каждого списка, и т.д.
до тех пор, пока каждый из списков не будет исчерпан. Функция MAPCAN "связывает"
свои результаты, используя функцию NCONC. Например:
$ (MAPCON 'REVERSE '(A B C D))
(D C B A D C B D C D)
Отметим, что функция MAPCON может легко "зацикливать" списки, поэтому использовать эту функцию нужно осторожно.
Функции MAPCAN и MAPCON можно определить с помощью функций MAPCAR
и MAPLIST следующим образом:
(MAPCAN FN x1 x2 ...xN) <--->
(APPLY (NCONC (MAPCAR FN x1 x2...xN)))
(MAPCON FN x1 x2 ...xN) <--->
(APPLY (NCONC (MAPLIST FN x1 x2...xN)))
На следующем шаге мы рассмотрим функционалы планирования функций.