ADN Club > AutoLisp / VisualLISP и DCL

Как при помощи ф-ции mapcar обрабатывать сложные списки?

(1/6) > >>

Юрий Ананьев:
Всем привет!

данный пример использования ф-ции 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)))

Алексей Кулик:
:) Правда, у меня сильные подозрения, что настолько заморачиваться особой необходимости нет: наверняка можно получить исходный список более однородной структурой.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии