Some of the expression handling code is very old and kind of confusing.
It may also be less performant. This stuff:
onearg(e, f) = e.head == :call && length(e.args) == 2 && e.args[1] == f
mapexpr(f, e) = Expr(e.head, map(f, e.args)...)
replace_syms!(x, membernames) = x
replace_syms!(q::QuoteNode, membernames) =
replace_syms!(Meta.quot(q.value), membernames)
replace_syms!(e::Expr, membernames) =
if onearg(e, :^) # TODO: Delete this branch after deprecation period
@warn "^() for escaping `Symbol`s is deprecated, use syms() instead"
e.args[2]
elseif onearg(e, :syms)
e.args[2]
elseif onearg(e, :_I_) # TODO: Delete this branch after deprecation period
@warn "_I_() for escaping variables is deprecated, use cols() instead"
addkey!(membernames, :($(e.args[2])))
elseif onearg(e, :cols)
addkey!(membernames, :($(e.args[2])))
elseif e.head == :quote
addkey!(membernames, Meta.quot(e.args[1]) )
elseif e.head == :.
replace_dotted!(e, membernames)
else
mapexpr(x -> replace_syms!(x, membernames), e)
end
Some of the expression handling code is very old and kind of confusing.
It may also be less performant. This stuff:
Should we use a more contemporary package to deal with expressions? Like
MacroTools?Or if it isn't broken, should we not fix it? I don't know very much about
MacroToolsbut I'm sure I could learn.