Une telle procédure existe-t-elle dans une norme Scheme et si oui, comment l'appelle-t-elle?

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

  •  01-07-2019
  •  | 
  •  

Question

J'ai recherché le nom d'une procédure, qui applique une arborescence de procédures à une arborescence de données, générant une arborescence de résultats - les trois arbres ayant la même structure.

Une telle procédure pourrait avoir la signature:

(map-tree data functree)

Sa valeur de retour serait le résultat de l'application élément par élément des éléments de functree sur les éléments de données correspondants.

Exemples (en supposant que la procédure s'appelle Map-tree):

Exemple 1:

(define *2 (lambda (x) (* 2 x)))
; and similar definitions for *3 and *5

(map-tree '(100 (10 1)) '(*2 (*3 *5)))

donnerait le résultat

(200 (30 5))

Exemple 2:

(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce)))
        '((car cdr) cadr))

donne le résultat

((aa bc) cd)

Cependant, je n’ai pas trouvé une telle fonction dans la documentation SLIB, que j’ai consultée.

Une telle procédure existe-t-elle déjà?
Sinon, quel nom conviendrait à la procédure et comment classeriez-vous ses arguments?

Était-ce utile?

La solution

Je n’ai pas un très bon nom pour la fonction. Je colle mon implémentation ci-dessous (je l'ai appelée map-traversing; les autres devraient suggérer un meilleur nom). J'ai modifié l'ordre des arguments avec celui de map lui-même.

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (func data)))

En utilisant vos exemples de données, nous avons:

(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))

Le deuxième exemple nécessite SRFI 26. (Permet d'écrire (cut * 2 <>) au lieu de (lambda (x) (* 2 x)).)

(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))

Le plus important est que vos fonctions ne doivent pas être citées, contrairement à votre exemple.

Autres conseils

J'ai constaté qu'avec la définition suivante du parcours de la carte, il n'était pas nécessaire d'indiquer les fonctions:

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

Remarque: dans ma version installée de Guile, pour une raison quelconque, seul (interaction-environment) ne génère pas l'erreur de variable non liée. Les autres environnements, à savoir (scheme-report-environment 5) et (null-environment 5), génèrent cette erreur.

Note 2: Par la suite, j'ai trouvé dans [1] que pour que (scheme-report-environment 5) et (null-environment 5) fonctionnent, vous devez d’abord utiliser (use-modules (ice-9 r5rs))

[1]: http: //www.mail -archive.com/bug-guile@gnu.org/msg04368.html 'Re: guile -c " (scheme-report-environment 5) " == > ERREUR: variable non liée: scheme-report-environment '

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top