2008-09-19 12 views
3

Я искал имя процедуры, которая применяет древовидную структуру процедур к древовидной структуре данных, давая древовидную структуру результатов - все три дерева имеют одинаковую структуру.Существует ли такая процедура в стандарте Схемы, и да, как она называется?

Такая процедура может иметь подпись:

(map-tree data functree)

Возвращаемое значение будет результатом поэлементного применения элементов functree на соответствующих элементов данных.

Примеры (при условии, что процедура называется карта-дерево):

Пример 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, с которой я консультировался.

Выполняется ли такая процедура?
Если нет, то каким будет подходящее имя для процедуры и как вы можете заказать его аргументы?

ответ

3

У меня нет хорошего имени для функции. Я вставляю свою реализацию ниже (я назвал ее 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))) 

Самое главное, что ваши функции должны быть не отсортированы, в отличие от вашего примера.

1

Я обнаружил, что с follwing определения карты-траверса, вам не нужно конец цитаты функции:

(define (map-traversing func data) 
    (if (list? func) 
     (map map-traversing func data) 
     (apply (eval func (interaction-environment)) (list data))))

Примечание: в моей установленной версии коварства, из-за какой-то причине, только (взаимодействие -environment) не вызывает ошибку Unbound variable. Другие среды, то есть (схема-отчет-среда 5) и (нуль-среда 5), повышают эту ошибку.

Примечание 2: Впоследствии я нашел в [1], что для работы (схема-отчет-среда-среда 5) и (нуль-среда 5) необходимо сначала использовать (использовать-модули (ice-9 r5rs))

[1]: http://www.mail-archive.com/[email protected]/msg04368.html 'Re: лукавства -c "(схема-отчет-среда 5)" ==> ОШИБКА: Unbound переменная: схема-отчет-среда'

+0

Верно, но тогда вам придется использовать eval, и большинство Schemers расскажут вам, что обычные программы не должны использовать eval. – 2008-09-19 07:48:56