Алексей, по поводу скорости согласен, сейчас она далеко не на первом месте...
Вероятнее всего с ней можно будет поразбираться если программа будет медленно работать из-за больших объемов данных.
В дальнейшем все таки постараюсь разобраться во всех представленных решениях, чтобы было понятно...
Ни одно из решений не подошло для обработки данных вида -
(
(набор1 характеристика3)
(набор1 характеристика12)
(
(набор2 характеристика1)
(набор2 характеристика3)
(набор3 характеристика1)
)
...
)
т.к. конечным элементом для обработки является список а не атом
попробовал подкорректировать одну из ф-ций #16 (пока более понятную)
вроде получилось -
(defun tree-apply (f lst)
(cond
((null lst) nil)
(
(= (type (car lst)) 'STR)
(cons (f (read(car lst)))
(tree-apply f (cdr lst)))
)
((listp (car lst))
(cons (tree-apply f (car lst))
(tree-apply f (cdr lst))))
(t
(cons (f (car lst))
(tree-apply f (cdr lst))))))
;пример 1
(defun d (a) (+ 10 a))
(setq lst '(1 2 3 (4 5 6) ((7 8 9) (10 11 12))))
(tree-apply d lst)
(11 12 13 (14 15 16) ((17 18 19) (20 21 22)))
;пример 2
(defun d1 (a) (+ 100 (car a)(cadr a)))
(setq lst1 '("(1 1)" "(2 2)" "(3 3)" ("(4 4)" "(5 5)" "(6 6)") (("(7 7)" "(8 8)" "(9 9)") ("(10 10)" "(11 11)" "(12 12)"))))
(tree-apply d1 lst1)
(102 104 106 (108 110 112) ((114 116 118) (120 122 124)))