Existe uma maneira abreviada de atualizar um campo struct específico na raquete?
Suponha que eu tenha uma estrutura com muitos campos:
(struct my-struct (f1 f2 f3 f4))
Se eu quiser retornar uma nova estrutura comf2
atualizado, eu tenho que reformular todos os outros campos:
(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))
O que é redundante e seria uma fonte de erros se eu atualizar o número dos campos ou alterar suas ordens.
Eu realmente me pergunto se existe uma maneira de atualizar um campo específico para uma estrutura como:
(my-struct-f2-update (my-struct 1 2 3 4)
(lambda (f2) (* f2 2)))
;; => (my-struct 1 4 3 4)
Ou posso apenas configurá-los para um novo valor como:
(define s (my-struct 1 2 3 4)
(my-struct-f2-set s (* (my-struct-f2 s) 2))
;; => (my-struct 1 4 3 4)
Observe, isso não está mudandos
aqui;my-struct-f2-update
emy-struct-f2-set
deveria estar apenas retornando uma cópia dos
comf2
campo atualizado.
Em Haskell, conheço a biblioteca de lentes que faz esse trabalho. Só estou me perguntando se existem algumas maneiras semelhantes que eu possa adotar para a raquete. Obrigado.