На этом шаге мы рассмотрим функцию 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, но, без сомнения, являются удобными изобразительными средствами. Во многих случаях с их помощью можно существенно сократить запись по сравнению с повторяющимися вычислениями, выраженными рекурсией или итерацией.
$ (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
)
На следующем шаге мы перейдем к объединяющим функционалам.