Я искал имя процедуры, которая применяет древовидную структуру процедур к древовидной структуре данных, давая древовидную структуру результатов - все три дерева имеют одинаковую структуру.
Такая процедура может иметь подпись:
(map-tree data functree)
Его возвращаемое значение будет результатом поэлементного применения элементов функционального дерева к соответствующим элементам данных.
Примеры (при условии, что процедура называется map-tree):
Пример 1:
(define *2 (lambda (x) (* 2 x))) ; and similar definitions for *3 and *5 (map-tree '(100 (10 1)) '(*2 (*3 *5)))
даст результат
(200 (30 5))
Пример 2:
(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce)))
'((car cdr) cadr))дает результат
((aa bc) cd)
Однако я не нашел такой функции в документации по SLIB, с которой я консультировался.
Такая процедура уже существует?
Если нет, то каково было бы подходящее имя для процедуры и как бы вы упорядочили ее аргументы?





У меня не очень удачное название для функции. Я вставляю свою реализацию ниже (я назвал ее map-traversing; другие должны предложить имя получше). Я сделал порядок аргументов зеркальным отражением самого map.
(define (map-traversing func data)
(if (list? func)
(map map-traversing func data)
(func data)))
Используя ваши образцы данных, мы имеем:
(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))
Для второго примера требуется SRFI 26. (позволяет писать (cut * 2 <>) вместо (lambda (x) (* 2 x)).)
(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))
Самое главное, чтобы все ваши функции не заключались в кавычки, в отличие от вашего примера.
Я обнаружил, что со следующим определением перемещения по карте вам не нужно убирать кавычки с функций:
(define (map-traversing func data)
(if (list? func)
(map map-traversing func data)
(apply (eval func (interaction-environment)) (list data))))Примечание: в моей установленной версии Guile по какой-то причине только (взаимодействие-среда) не вызывает ошибку несвязанной переменной. Другие среды, то есть (схема-отчет-среда 5) и (нулевая среда 5) вызывают эту ошибку.
Примечание 2: Впоследствии я обнаружил в [1], что для работы (scheme-report-environment 5) и (null-environment 5) вам нужно сначала (use-modules (ice-9 r5rs))
[1]: http://www.mail-archive.com/[email protected]/msg04368.html 'Re: guile -c "(схема-отчет-среда 5)" ==> ОШИБКА: несвязанная переменная: схема-отчет-среда'
Обычные программы не должны использовать eval.
Верно, но тогда вам придется использовать eval, и большинство программистов скажут вам, что обычные программы не должны использовать eval.