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

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

    Синтаксис функции MAPC в muLISP81 следующий:


   (MAPC FN LST) ,
где:

    Функция MAPC последовательно применяет FN к элементам списка, т.е. к (CAR LST), (CAR (CDR LST)) и т.д.

    Код функции в muLISP81 таков:

   (DEFUN MAPC (LAMBDA (FUN LST)
      (LOOP
         ( (NULL LST) NIL )
         (PRINT (FUN (POP LST)))
      )
   ))


    Пример.
   (DEFUN DEMO (LAMBDA (LST)
      (PRIN1 "Результат действия MAPC: ") (MAPC PRIMER LST)
   ))
   % ----------------------- %
   (DEFUN PRIMER (LAMBDA (LST)
      (PLUS (CAR LST) 1)
   ))
   % ------------------------- %
   (DEFUN MAPC (LAMBDA (FUN LST)
      (LOOP
         ( (NULL LST) NIL )
         (PRINT (FUN (POP LST)))
      )
   ))

    В системе muLISP85 функция (MAPC FN LST11 ...LSTN) выполняет действия, указанные функцией FN над CAR-элементами списков LST1,...,LSTN, затем - над CDR-элементами каждого списка, и т.д. до тех пор, пока каждый список не будет исчерпан. Функция МАРС возвращает список LST1. Например:


   $ (MAPC 'PRIN1 '(DOG CAT COW))
   DOGCATCOW
Учтите, что функция вернет (DOG CAT COW).

    Код функции в muLISP85 таков:

   (DEFUN MAPC (FUNC LST1 LST2)
      ( (OR (NULL LST1) (NULL LST2)) LST1 )
      ( FUNCALL FUNC (CAR LST1) (CAR LST2) )
      ( MAPC FUNC (CDR LST1) (CDR LST2) )
      LST1
   )

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


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

   $ (MAPL 'PRIN1 '(A B C))
   (A B C) (B C) (C)
Приведем код этого функционала:
   (DEFUN MAPL (FUNC LST1 LST2)
      ( (OR (NULL LST1) (NULL LST2)) LST1 )
      ( FUNCALL FUNC LST1 LST2 )
      ( MAPL FUNC (CDR LST1) (CDR LST2) )
      LST1
   )



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




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