Предположим, что у меня есть структура со многими полями:
(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 я знаю библиотеку "объектив", которая выполняет эту работу. Мне просто интересно, есть ли подобные способы, которые я могу принять для ракетки. Спасибо.