Есть ли сокращенный способ обновить определенное поле структуры в ракетке?
Предположим, у меня есть структура со многими полями:
(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
поле обновлено.
В Хаскеле я знаю библиотеку «линз», которая делает эту работу. Мне просто интересно, есть ли какие-то похожие способы, которые я могу использовать для ракетки. Благодарю.