Gibt es eine Möglichkeit, ein bestimmtes Strukturfeld im Racket zu aktualisieren?
Angenommen, ich habe eine Struktur mit vielen Feldern:
(struct my-struct (f1 f2 f3 f4))
Wenn ich eine neue Struktur mit @ zurückgeben sof2
aktualisiert, ich muss alle anderen Felder umformulieren:
(define s (my-struct 1 2 3 4))
(my-struct (my-struct-f1 s)
(do-something-on (my-struct-f2 s))
(my-struct-f3 s)
(my-struct-f4 s))
Was überflüssig ist und eine Fehlerquelle darstellen würde, wenn ich die Anzahl der Felder aktualisiere oder deren Reihenfolge ändere.
Ich frage mich wirklich, ob es eine Möglichkeit gibt, ein bestimmtes Feld für eine Struktur wie die folgende zu aktualisieren:
(my-struct-f2-update (my-struct 1 2 3 4)
(lambda (f2) (* f2 2)))
;; => (my-struct 1 4 3 4)
Oder ich kann sie einfach auf einen neuen Wert setzen als:
(define s (my-struct 1 2 3 4)
(my-struct-f2-set s (* (my-struct-f2 s) 2))
;; => (my-struct 1 4 3 4)
Hinweis, das ist nicht mutierends
Hier;my-struct-f2-update
undmy-struct-f2-set
sollte nur eine Kopie von @ zurücksends
mitf2
Feld aktualisiert.
In Haskell kenne ich die 'Objektiv'-Bibliothek, die diese Arbeit erledigt. Ich frage mich nur, ob es ähnliche Möglichkeiten gibt, die ich für Schläger anwenden kann. Vielen Dank