Angenommen, ich habe eine Struktur mit vielen Feldern:Gibt es eine Kurzform, um ein bestimmtes Strukturfeld im Racket zu aktualisieren?
(struct my-struct (f1 f2 f3 f4))
Wenn ich eine neue Struktur mit f2
aktualisiert zurückzukehren, muss ich alle anderen Felder neu formulieren:
(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))
Welche überflüssig und würde eine Fehlerquelle sein, wenn ich die Anzahl der Felder aktualisiere oder ihre Bestellungen ändere.
Ich frage mich wirklich, ob es eine solche Art und Weise, das ich wie ein bestimmtes Feld für eine Struktur 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 nur auf einen neuen Wert gesetzt, wie:
(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 mutiert hier nicht s
; my-struct-f2-update
und my-struct-f2-set
sollten nur eine Kopie von s
mit f2
Feld aktualisiert werden.
In Haskell kenne ich die "Objektiv" -Bibliothek, die diese Aufgabe erledigt. Ich frage mich nur, ob es einige ähnliche Möglichkeiten gibt, die ich für den Schläger übernehmen kann. Vielen Dank.
Beachten Sie, dass dieses Makro, wie struct-copy, Unterstrukturfelder verliert. –
@ SamTobin-Hochstadt Wahr. Es wäre schön, eine Möglichkeit zu haben, Informationen über eine Strukturinstanz zur Laufzeit zu erhalten, obwohl ich denke, dass dies das Konzept der undurchsichtigen Strukturen verletzen könnte. –
Sollten Sie diese Antwort aktualisieren, um einen Link zur [Dokumentation hier] hinzuzufügen (http://docs.racket-lang.org/alexis-util/Untyped_Utilities.html#%28part._.Purely_.Functional_.Struct_.Updaters% 29) für das jetzt, dass es in einem Paket ist? –