Функции планирования

Функции планирования Функции планирования, или MAP — функции (mapping function) представляют собой важный класс функций в языке программирования Лисп. Их даже правильно будет называть функционалами, поскольку в качестве аргументов они принимают другие функции. MAP — функционалы отражают список или последовательность в новую последовательность или порождают побочный эффект, который является связанным с этой последовательностью. Имена функций планирования начинаются с MAP и их вызов имеет вид: (MAPx fn i1 i2 ... iN) , где fn — функция от N аргументов, i1, i2, ..., iN — списки. Часто MAP — функционал применяется к другу аргумента — списка, то есть fn является функцией одного аргумента (MAPx fn <список>). 1. Повторение вычисления функции на элементах списка ( MAPCAR <функция> <список1> ... <списокN>) Выполняются действия <функции> над CAR-элементами списков, затем над другими элементами списков и так далее пока элементы хотя бы в одном списке не закончатся.
flyinsky.ru
Для двух входных списков в Лиспе эта функция может быть визначена следующим образом: (DEFUN MAPCAR2 (func lst1 lst2) ((OR (NULL lst1) (NULL lst2)) NIL) (CONS (FUNCALL func (CAR lst1) (CAR lst2)) (MAPCAR2 func (CDR lst1) (CDR lst2)))) Результатом функции является список, построенный по результатов вызова функционального аргумента MAPCAR. $ (MAPCAR '+' (1 2 3) '(7 8 9) "(10 11 12)) $ (MAPCAR' cons '(1 2 3)' (abc)) (18 21 24) ((1. A) (2. B) (3. C)) $ (MAPCAR 'atom' (1 2 3 4)) $ (MAPCAR «(lambda (x) (list x (* xx)))» (1 2 3)) (TTTT) ((1 1) (2 4) (3 9)) 2. Повторение вычисления функции на хвостовых частях списка ( MAPLIST <функция> <список1> ... <списокN>) Функция MAPLIST в отличие от функции MAPCAR действует не над элементами списков, а над их хвостовыми последовательностями. То есть сначала действия выполняются над входными спискам, потом — над их CDR — элементами, и так далее пока хотя бы один из списков не будет исчерпан. Для двух входных списков в Лиспе эта функция может быть визначена следующим образом: (DEFUN MAPLIST2 (func lst1 lst2) ((OR (NULL lst1) (NULL lst2)) NIL) (CONS (FUNCALL func lst1 lst2) (MAPLIST2 func (CDR lst1) (CDR lst2)))) $ (MAPLIST «CONS» (1 2 3) "(10 12 ноября)) $ (MAPLIST «REVERSE» (1 2 3 4)) (((1 2 3) 10 11 12) ((2 3) 11 12) ((3) 12)) ((4 3 2 1) (4 3 2) (4 3) (4)) 3. О ' объединяющие функции ( MAPCAN <функция> <список1> ... <списокN>) ( MAPCON <функция> <список1> ... <списокN>) Функции MAPCAN и MAPCON являются соответственно аналогами функций MAPCAR и MAPLIST, только они не строят новый список из результатов используя функцию LIST, а связывают результаты (которые обязательно должны быть списками), используя функцию NCONC. Сплачивающие функции можно использовать как фильтры. Под фильтром мы будем понимать функцию, которая оставляет или удаляет элементы, которые удовлетворяют определенному условию. Следующий пример показывает, как можно из списка исключить все неотъемлемые числа. $ (MAPCAN «(LAMBDA (n) ((MINUSP n) (LIST n)))» (2 -3 3 4 -4 -5 5)) (- 3 -4 -5) Отметим, что следующие действия эквивалентны: ( MAPCAN f '(x1 x2 ... xN)) и ( NCONC (f 'x1) (f' x2) ... (f 'xN)) ( MAPCAN f x1 x2 ... xN) и ( APPLY ' NCONC ( MAPCAR f x1 x2 ... xN)) ( MAPCON f x1 x2 ... xN) и ( APPLY ' NCONC ( MAPLIST f x1 x2 ... xN)) $ (MAPCON «REVERSE» (1 2 3)) $ (APPLY 'NCONC (MAPLIST «REVERSE» (1 2 3))) (3 2 1 3 2 3) ( 3 2 1 3 2 3) 4. Вычисление функции и с утерей результата ( MAPC <функция> <список1>. ... <списокN>) ( MAPL <функция> <список1> ... <списокN>) Функции MAPC и MAPL являются соответственно аналогами функций MAPCAR и MAPLIST, только они не собирают и не объединяют результаты. Результаты, получаемые просто не сохраняются. В качестве результата возвращается второй аргумент функции. Эти функции используют для получения побочного эффекта: $ (MAPC «(LAMBDA (uv) (SET uv))» (abc) '(1 2 3)) (ABC) После этого значением переменных a, b, c будут соответственно присвоены числа 1,2 и 3. Функции планирования можно объединять в более сложные структуры, их композицию можно использовать при определении других функций. Например, декартово произведение двух множеств можно просто получить с помощью композиции двух вложенных вызовов функционала MAPCAR (дело подано результат работы функции): (DEFUN decart (xy) $ (decart «(qw)» (2 3 4 )) (MAPCAR (((Q 2) (Q 3) (Q 4)) ((W 2) (W 3) (W 4))) '( LAMBDA (x1) (MAPCAR "(LAMBDA (y1) Заменим во второй строке функцию (LIST x1 y1)) MAPCAR на MAPCAN, получим: y)) ((Q 2) (Q 3) (Q 4) (W 2) (W 3) (W 4)) x)) MAP — функционалы НЕ повышают вычислительную мощность Лиспа, но удобны средствами в программировании. Как мы увидели, в качестве первого их аргумента является функция. В зависимости от арности этой функции, после функционального аргумента идет соответствующее аргументов — списков. Если списки разные по длине, то количество повторений определяется длиной наиболее короткого списка. Рассмотрим пример применения функций планирования на примере задачи сложения двух матриц. Функция vectorsum находит вектор, равный сумме ее двух аргументов — векторов. Функция ADDMATR находит сумму двух матриц. (DEFUN vectorsum (xy) (DEFUN addmatr (xy) (MAPCAR '+ xy)) (MAPCAR' vectorsum xy)) $ (addmatr "((1 2 3) (4 5 6) (7 8 9)) '((1 1 1) (2 2 2) (3 3 3))) $ ((2 3 4 ) (6 7 8) (10 11 12)) Следующие предикаты планирования выполняют тестовые функции над элементами одного или нескольких списков пока не встретится либо критерий окончания, или конец одного из списков. Следующие функции выполняют действия предиката <тест> над car-объектами <списку1> ..., <спискуN>, затем — над cadr-объектами каждого списка и так далее пока тест не вернет значение, отличное от NIL, либо не встретится конец списка.

Комментарии и пинги к записи запрещены.

Комментарии закрыты.