На этом шаге мы рассмотрим функцию 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 )
На следующем шаге мы перейдем к объединяющим функционалам.