Esse procedimento existe em um padrão de esquema e, se sim, como é chamado?

StackOverflow https://stackoverflow.com/questions/98394

  •  01-07-2019
  •  | 
  •  

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?

Foi útil?

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'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top