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