Create Formulas with Macros

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)
2 Likes