Załóżmy, że mam struct z wielu dziedzin:Czy istnieje skrótowy sposób aktualizowania określonego pola struktury w przekrętach?
(struct my-struct (f1 f2 f3 f4))
Jeśli mam wrócić nowy struct z f2
zaktualizowane, muszę rephrase co inne dziedziny:
(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))
co jest zbędne i że być źródłem błędów, jeśli zaktualizuję liczbę pól lub zmieniam ich zamówienia.
Naprawdę zastanawiam się, czy istnieje taki sposób mogę zaktualizować określonego pola dla struct jak:
(my-struct-f2-update (my-struct 1 2 3 4)
(lambda (f2) (* f2 2)))
;; => (my-struct 1 4 3 4)
Albo można po prostu ustawić je do nowej wartości, jak:
(define s (my-struct 1 2 3 4)
(my-struct-f2-set s (* (my-struct-f2 s) 2))
;; => (my-struct 1 4 3 4)
zawiadomieniu to nie mutuje tutaj s
; my-struct-f2-update
i my-struct-f2-set
powinny zwracać kopię zaktualizowanego pola s
z f2
.
W Haskell znam bibliotekę "soczewki", która wykonuje to zadanie. Zastanawiam się tylko, czy są jakieś podobne sposoby, które mogę zaadoptować na rakietę. Dzięki.
Należy zauważyć, że to makro, podobnie jak struktura-kopia, utraci pola podstruktury. –
@ SamTobin-Hochstadt True. Byłoby miło mieć sposób na uzyskanie informacji o instancji struktury w czasie wykonywania, choć myślę, że może to naruszyć koncepcję nieprzejrzystych struktur. –
Należy zaktualizować tę odpowiedź, aby dodać łącze do [dokumentacji tutaj] (http://docs.racket-lang.org/alexis-util/Untyped_Utilities.html#%28part._.Purely_.Functional_.Struct_.Updaters% 29) do tego teraz, gdy jest w paczce? –