2008-09-19 5 views
3

J'ai cherché le nom d'une procédure, qui applique une arborescence de procédures à une structure arborescente de données, ce qui donne une structure arborescente des résultats - les trois arbres ayant la même structure.Une telle procédure existe-t-elle dans une norme Scheme et si oui, comment s'appelle-t-elle?

Une telle procédure pourrait avoir la signature:

(map-tree data functree)

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

exemples (en supposant que la procédure est appelée carte-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 serait le nom approprié pour la procédure, et comment commanderiez-vous ses arguments?

Répondre

3

Je n'ai pas un très bon nom pour la fonction. Je colle mon implémentation ci-dessous (je l'ai appelé map-traversing, d'autres devraient suggérer un meilleur nom). J'ai fait en sorte que l'ordre des arguments reflète celui de map lui-même.

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

Utilisation de vos données d'échantillons, nous avons:

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

Le deuxième échantillon nécessite SRFI 26. (permet l'écriture (cut * 2 <>) au lieu de (lambda (x) (* 2 x)).)

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

La chose la plus importante est que vos fonctions doivent toutes être non-citées, contrairement à votre exemple.

1

Je trouve que la définition de la carte follwing-déplacement, vous ne avez pas besoin de CITATION les fonctions:

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

Note: dans ma version installée de Guile, pour une raison quelconque, que (interaction -environment) n'augmente pas l'erreur de variable Unbound. Les autres environnements, c'est-à-dire (scheme-report-environment 5) et (null-environment 5), déclenchent cette erreur.

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

[1]: http://www.mail-archive.com/[email protected]/msg04368.html 'Re: point de fraude -c "(schéma-rapport-environnement 5)" ==> eRREUR: Variable Unbound: schéma-report-environnement'

+0

vrai, mais vous auriez pour utiliser eval, et la plupart des Schemers vous diront que les programmes normaux ne doivent pas utiliser eval. –

+0

Les programmes normaux ne doivent pas utiliser 'eval'. –

Questions connexes