На этом шаге мы рассмотрим функцию 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.