Существует ли такая процедура в стандарте Scheme, и если да, как она называется?

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
343
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Chris Jester-Young 19.09.2008 11:48

Обычные программы не должны использовать eval.

Nathan Shively-Sanders 26.09.2008 06:51

Другие вопросы по теме