Есть ли сокращенный способ обновить определенное поле структуры в ракетке?

Предположим, у меня есть структура со многими полями:

(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 поле обновлено.

В Хаскеле я знаю библиотеку «линз», которая делает эту работу. Мне просто интересно, есть ли какие-то похожие способы, которые я могу использовать для ракетки. Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос