ADN Club > AutoLisp / VisualLISP и DCL
Как при помощи ф-ции mapcar обрабатывать сложные списки?
Юрий Ананьев:
Всем привет!
данный пример использования ф-ции mapcar
--- Код - Auto/Visual Lisp [Выбрать] ---(mapcar '(lambda (x) (+ 10 x)) '(1 2 3))
возвращает список результатов (11 12 13)
но требуется обработать список с более сложной структурой
--- Код - Auto/Visual Lisp [Выбрать] ---(mapcar '(lambda (x) (+ 10 x)) (list 1 2 3 (list 4 5 6) (list (list 7 8 9) (list 10 11 12)) ) )на выходе получаем
error: bad argument type: numberp: (4 5 6)
Не подскажете каким образом на выходе получить список результатов с такой же структурой как и на входе?
т.е. для данного примера - (11 12 13 (14 15 16) ((17 18 19) (20 21 22)))
Алексей Кулик:
В принципе для такой обработки практически идеально подойдет рекурсия. Немного погодя попробую нарисовать код, сейчас срочной работы многовато...
Алексей Кулик:
В качестве первой прикидки:
--- Код - Auto/Visual Lisp [Выбрать] ---(setq lst '(1 2 3 (4 5 6) ((7 8 9) (10 11 12)))) (mapcar (function (lambda (x / f) (defun f (x1) (cond ((listp x1) (mapcar (function f) x1) ) (t (+ 10 x1)) ) ;_ end of cond ) ;_ end of defun (f x) ) ;_ end of lambda ) ;_ end of function lst ) ;_ end of mapcar
Юрий Ананьев:
Спасибо Алексей!
Все работает!!
Попытался на основе твоего кода создать универсальный mapcar для обработки сложных списков -
--- Код - Auto/Visual Lisp [Выбрать] --- (defun $-mapcar (fnc sp)(mapcar (function (lambda (x / f) (defun f (x1) (cond ((listp x1) (mapcar (function f) x1) ) (t (eval (read (strcat "(" fnc " x1)")))) ) ;_ end of cond ) ;_ end of defun (f x) ) ;_ end of lambda ) ;_ end of function sp ) ;_ end of mapcar); defun (defun d (a) (+ 10 a)) (defun c:test () (setq lst '(1 2 3 (4 5 6) ((7 8 9) (10 11 12)))) (setq res ($-mapcar "d" lst)) (print res) (princ)); defun Command: TEST(11 12 13 (14 15 16) ((17 18 19) (20 21 22)))
Алексей Кулик:
:) Правда, у меня сильные подозрения, что настолько заморачиваться особой необходимости нет: наверняка можно получить исходный список более однородной структурой.
Навигация
Перейти к полной версии