Предположим, что у меня есть структура со многими полями:
(struct my-struct (f1 f2 f3 f4))
Если мне нужно обновить новую структуру с f2, я должен перефразировать все остальные поля:
(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))
Это избыточно и будет источником ошибок, если я обновляю количество полей или изменю их порядок.
Мне действительно интересно, есть ли такой способ, я могу обновить определенное поле для структуры, например:
(my-struct-f2-update (my-struct 1 2 3 4)
(lambda (f2) (* f2 2)))
;; => (my-struct 1 4 3 4)
Или я могу просто установить их в новое значение как:
(define s (my-struct 1 2 3 4)
(my-struct-f2-set s (* (my-struct-f2 s) 2))
;; => (my-struct 1 4 3 4)
Обратите внимание, что здесь нет мутации s; my-struct-f2-update и my-struct-f2-set должны просто вернуть копию s с обновленным полем f2.
В Haskell я знаю библиотеку "объектив", которая выполняет эту работу. Мне просто интересно, есть ли подобные способы, которые я могу принять для ракетки. Спасибо.