Esiste tale procedura in uno standard di Schema e se sì, come viene chiamata?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Ho cercato il nome di una procedura, che applica una struttura ad albero di procedure a una struttura ad albero di dati, producendo una struttura ad albero di risultati: tutti e tre gli alberi hanno la stessa struttura.

Tale procedura potrebbe avere la firma:

(map-tree data functree)

Il suo valore restituito sarebbe il risultato dell'applicazione elementare degli elementi di functree sugli elementi di dati corrispondenti.

Esempi (assumendo che la procedura si chiami map-tree):

Esempio 1:

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

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

darebbe il risultato

(200 (30 5))

Esempio 2:

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

dà il risultato

((aa bc) cd)

Tuttavia non ho trovato tale funzione nella documentazione di SLIB, che ho consultato.

Esiste già una procedura del genere?
In caso contrario, quale sarebbe un nome adatto per la procedura e come ordineresti i suoi argomenti?

È stato utile?

Soluzione

Non ho un nome molto adatto per la funzione.Incollo la mia implementazione di seguito (l'ho chiamata map-traversing;altri dovrebbero suggerire un nome migliore).Ho fatto in modo che l'ordine degli argomenti rispecchi quello di map si.

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

Utilizzando i dati di esempio, abbiamo:

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

Il secondo campione richiede SRFI 26.(Permette la scrittura (cut * 2 <>) invece di (lambda (x) (* 2 x)).)

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

La cosa più importante è che le tue funzioni devono essere tutte senza virgolette, a differenza del tuo esempio.

Altri suggerimenti

Ho scoperto che con la seguente definizione di map-traversing, non è necessario togliere le virgolette alle funzioni:

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

Nota:nella mia versione installata di Guile, per qualche motivo, solo (ambiente di interazione) non solleva l'errore della variabile Unbound.Gli altri ambienti, ad es.(scheme-report-environment 5) e (null-environment 5) sollevano questo errore.

Nota 2:Successivamente, ho scoperto in [1] che affinché (scheme-report-environment 5) e (null-environment 5) funzionino, è necessario prima (use-modules (ice-9 r5rs))

[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html 'Rif:guile -c "(scheme-report-environment 5)" ==> ERRORE:Variabile non vincolata:schema-report-ambiente'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top