Hi, let me announce a beta package Reconstructables.jl:
https://github.com/tkf/Reconstructables.jl
Reconstructables.jl provides helper functions and macros to work with immutable structs in Julia. For example, using @recon macro, you can reconstruct a new struct with the nested field .x.y.z modified from the one in old by:
new = @recon old.x.y.z = 3
It works even when old, x and y are all immutable, provided that their they have keyword-only constructor. To generate keyword-only constructor, it also provides another macro @add_kwonly. For example,
struct A
x
y
@add_kwonly A(x, y=2) = new(x, y)
end
expands to:
struct A
x
y
A(x, y) = new(x, y)
A(; x = throw(UndefKeywordError(:x)), y=2) = new(x, y)
end
Note that @recon and @add_kwonly are independent tools (in some sense). For example, @recon also works nicely with @with_kw from Parameters.jl. You may want to use @add_kwonly instead of @with_kw if you need to do something inside the inner constructor, like handling type parameters.
See more details in README.
I just sent a PR to METADATA.jl so if you want to try it out right now, use: It’s now in METADATA. You can install it by:
Pkg.add("Reconstructables")
A bit of history: this package is a spin-off from a PR in JuliaDiffEq/DiffEqBase.jl where we tried to solve a similar problem. I wrote @add_kwonly for DiffEqBase.jl and then @ChrisRackauckas suggested to make a package out of it since it may be useful elsewhere (Thanks!). But I thought one macro is not enough for a package so I wrote @recon ![]()