With Macrotools.jl
using MacroTools
macro form(nt, expr)
@capture(expr, :lhs_ ~ rhs_)
new_rhs = MacroTools.postwalk(rhs) do subex
if @capture(subex, :s_)
return :($nt[$(QuoteNode(s))])
else
return subex
end
end
return :( merge($nt, (; $lhs = $new_rhs)) )
end
val = (; a =1, b=2)
@form(val, :a ~ :a + :b + 1) # returns (a = 4, b = 2)