Esse procedimento existe em um padrão de esquema e, se sim, como é chamado?
Pergunta
Procurei o nome de um procedimento, que aplica uma estrutura de procedimentos de árvore a uma estrutura de dados de dados, produzindo uma estrutura de árvores de resultados - todas as três árvores com a mesma estrutura.
Esse procedimento pode ter a assinatura:
(map-tree data functree)
Seu valor de retorno seria o resultado da aplicação do elemento dos elementos da functree nos elementos de dados correspondentes.
Exemplos (assumindo que o procedimento seja chamado de mapa):
Exemplo 1:
(define *2 (lambda (x) (* 2 x))) ; and similar definitions for *3 and *5 (map-tree '(100 (10 1)) '(*2 (*3 *5)))
produziria o resultado
(200 (30 5))
Exemplo 2:
(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce))) '((car cdr) cadr))
produz o resultado
((aa bc) cd)
No entanto, não encontrei essa função na documentação do slib, que eu consultei.
Esse procedimento já existe?
Caso contrário, qual seria um nome adequado para o procedimento e como você pediria seus argumentos?
Solução
Não tenho um nome muito bom para a função. Estou colando minha implementação abaixo (eu chamei map-traversing
; outros devem sugerir um nome melhor). Eu fiz a ordem de argumento espelhar a de map
em si.
(define (map-traversing func data)
(if (list? func)
(map map-traversing func data)
(func data)))
Usando seus dados de amostra, temos:
(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))
A segunda amostra requer SRFI 26. (permite escrever (cut * 2 <>)
ao invés de (lambda (x) (* 2 x))
.)
(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))
O mais importante é que todas as suas funções devem não ter palestras, ao contrário do seu exemplo.
Outras dicas
Descobri que, com a definição seguinte de troca de mapas, você não precisa desistir das funções:
(define (map-traversing func data) (if (list? func) (map map-traversing func data) (apply (eval func (interaction-environment)) (list data))))
Nota: Na minha versão instalada do Guile, apenas por algum motivo, apenas (interação-ambiente) não levanta o erro de variável não ligada. Os outros ambientes, isto é (esquema-relatório-ambiente 5) e (nulo-ambiente 5) aumentam esse erro.
Nota 2: Posteriormente, descobri em [1] que para (esquema-relatório-ambiente 5) e (NULL-ANIREMAMENTO 5) para trabalhar, você precisa primeiro (módulos de uso (ICE-9 R5Rs)))
[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html 'Re: Guile -C "(Scheme-Report-Aurnerment 5)" ==> Erro: Variável Unbound: Scheme-relation-ambiente'