Lenses in Julia
Accessors.jl построен вокруг концепции линз, позволяющих получать доступ или заменять глубоко вложенные части сложных объектов. Линзы создаются с помощью макроса @optic или напрямую, а затем комбинируются операторами opcompose, ⨟ или ∘. Важная особенность — неизменяемость: при изменении создается новая копия объекта, а не мутируется оригинал.
Для реализации линз требуется определить всего две функции: set(obj, lens, val) и вызов lens(obj), которые должны удовлетворять трем законам линз. Первый закон гарантирует, что полученное значение совпадает с установленным; второй — что установка существующего значения не изменяет объект; третий — что последнее изменение имеет приоритет. Для сравнения значений вместо == могут использоваться isequal или ≈, особенно для типов с особыми правилами сравнения, таких как Float64.