Существует ли такая процедура в стандарте Схемы, и если да, то как она называется? - PullRequest
3 голосов
/ 19 сентября 2008

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

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

(map-tree data functree)

Его возвращаемое значение будет результатом поэлементного применения элементов 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, с которой я ознакомился.

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

Ответы [ 2 ]

3 голосов
/ 19 сентября 2008

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

Я обнаружил, что с последующим определением обхода карты вам не нужно заключать в кавычки функции:

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

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

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

[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html 'Re: guile -c "(схема-отчет-среда 5)" == > ОШИБКА: несвязанная переменная: схема-отчет-среда '

...