Шаг 26.
Объединяющие функционалы

    На этом шаге мы введем понятие объединяющих функционалов.

    Функция:


   (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 и MAPCON не строят, используя LIST, новый список из результатов, а объединяют списки, являющиеся результатами, в один список, используя функцию NCONC.

    Функции 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)))



    На следующем шаге мы рассмотрим функционалы планирования функций.




Предыдущий шаг Содержание Следующий шаг