Шаг 24.
Отображающие функционалы. Функция MAPLIST

    На этом шаге мы рассмотрим функцию MAPLIST.

    Функция MAPLIST действует подобно функции MAPCAR, но действия осуществляются не над элементами списка, а над последовательными CDR (начиная с исходного списка) этого списка.

    Приведем код функции для muLISP81:

   (DEFUN MAPLIST (LAMBDA (FUN LST)
      (COND ( (NULL LST) NIL )
            (   T   (CONS (FUN LST)
                          (MAPLIST FUN (CDR LST))) )
      )
   ))
Тестовый пример:

   $ (MAPLIST (LAMBDA (Y) Y) (A B C))
   ((A B C) (B C) (C))


    Пример.
   (DEFUN DEMO (LAMBDA NIL)
      (PRIN1 "Результат действия MAPLIST: ")
      (MAPLIST SUMMA (1 2 3))
   ))
   % ---------------------- %
   (DEFUN SUMMA (LAMBDA (LST)
   % Функция возвращает сумму элементов списка LST %
      (COND ( (NULL LST) 0)
            (  T  (PLUS (CAR LST) (SUMMA (CDR LST))) )
      )
   ))
   % ---------------------------- %
   (DEFUN MAPLIST (LAMBDA (FUN LST)
      (COND ( (NULL LST) NIL )
            (   T  (CONS (FUN LST)
                         (MAPLIST FUN (CDR LST))) )
      )
   ))
Тестовый пример:

   $ (DEMO)
   (6 5 3)

    В системе muLISP85 функция (MAPLIST FN LST1...LSTN) выполняет действия, предписанные функцией FN над элементами списков LIST1,...,LISTN, затем - над CDR-элементами каждого списка и т.д. до тех пор, пока каждый из списков не будет исчерпан. Функция MAPLIST возвращает список результатов. Например:


   $ (MAPLIST 'REVERSE '(A B C D))
   ((D C B A) (D C B) (D C) (D))
Код функции в системе muLISP85 выглядит так:
   (DEFUN MAPLIST (FUNC LST1 LST2)
      ( (OR (NULL LST1) (NULL LST2)) NIL )
      (CONS (FUNCALL FUNC LST1 LST2)
            (MAPLIST FUNC (CDR LST1) (CDR LST2)))
   )

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

    На следующем шаге мы продолжим изучение отображающих функционалов, в частности, рассмотрим функцию MAPC.




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