To answer you questions:
(a) Meta.quot(:symbol) will insert a literal symbol. You can do this
manually by writing `Expr(:quot, :symbol)` if you prefer -- the result
is the same.
(b) Expr(:tuple, args...) is the expression form of a tuple.
tuple(args...) is the equivalent runtime expression.
(c) Code example:
function kwargsfunc(args...; kwargs...)
@show args
@show kwargs
end
macro tokwargs(expr)
code = Expr(:tuple)
for sym in expr.args # an array of symbols
push!(code.args, Expr(:tuple,
Meta.quot(symbol(string(sym))), sym))
end
return esc(code)
end
a = 3
b = 1
t = @tokwargs([a,b])
dump(t)
kwargsfunc(t) # test
kwargsfunc(;t...) # this is what I want to do