Gibt es ein solches Verfahren in einem Schema -Standard und wenn ja, wie wird es aufgerufen?

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich suchte nach dem Namen eines Verfahrens, das eine Baumstruktur von Verfahren auf eine Baumstruktur von Daten anwendet und eine Baumstruktur von Ergebnissen ergibt - alle drei Bäume mit derselben Struktur.

Ein solches Verfahren könnte die Unterschrift haben:

(map-tree data functree)

Der Rückgabewert wäre das Ergebnis der elementalen Anwendung der Elemente von Functree auf die entsprechenden Datenelemente.

Beispiele (unter der Annahme, dass das Verfahren als MAP-TREE bezeichnet wird):

Beispiel 1:

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

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

würde das Ergebnis liefern

(200 (30 5))

Beispiel 2:

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

ergibt das Ergebnis

((aa bc) cd)

Ich fand jedoch keine solche Funktion in der Slib -Dokumentation, die ich konsultierte.

Existiert ein solches Verfahren bereits?
Wenn nicht, was wäre ein geeigneter Name für das Verfahren und wie würden Sie seine Argumente bestellen?

War es hilfreich?

Lösung

Ich habe keinen sehr guten Namen für die Funktion. Ich füge meine Implementierung unten ein (ich habe sie angerufen map-traversing; Andere sollten einen besseren Namen vorschlagen). Ich habe den Argumentorder gemacht, das der von widerspiegelt map selbst.

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

Mit Ihren Beispieldaten haben wir:

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

Die zweite Probe erfordert SRFI 26. (Ermöglicht das Schreiben (cut * 2 <>) Anstatt von (lambda (x) (* 2 x)).)

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

Das Wichtigste ist, dass Ihre Funktionen im Gegensatz zu Ihrem Beispiel alle nicht zeigten.

Andere Tipps

Ich habe festgestellt, dass Sie mit der Follwing-Definition von MAP-Traversen die Funktionen nicht entlasten müssen:

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

Hinweis: In meiner installierten Guile-Version erhöht nur aus irgendeinem Grund (Interaktionsumgebung) den ungebundenen variablen Fehler nicht. Die anderen Umgebungen, dh (Schema-Report-Umwelt 5) und (Null-Umwelt 5), erhöhen diesen Fehler.

ANMERKUNG 2: Anschließend fand ich in [1], dass Sie zuerst (Anwendungsmodules (ICE-9 R5Rs)) zuerst (Nutzungsmodul (ICE-9 R5Rs)) (Null-Umwelt 5) (Null-Umwelt 5) arbeiten, um (Schema-Report-Umwelt 5) und (Null-Umwelt 5) zu arbeiten.

[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html 'Re: Guile -c "(Schema-Report-Umwelt 5)" ==> Fehler: Ungebundene Variable: Schema-Report-Umgebung "

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top