Skip to content

Instantly share code, notes, and snippets.

@YingboMa
Created January 12, 2020 02:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YingboMa/d2254067542a6f881c8293bcc8d3961e to your computer and use it in GitHub Desktop.
Save YingboMa/d2254067542a6f881c8293bcc8d3961e to your computer and use it in GitHub Desktop.
Got from Mason Protter
# by Mason Protter
using MacroTools: MacroTools, splitdef, combinedef, @capture
macro specialize_vararg(n::Int, fdef)
d = splitdef(fdef)
args = d[:args][end]
@assert d[:args][end] isa Expr && d[:args][end].head == Symbol("...")
args_symbol = d[:args][end].args[]
fdefs = Expr(:block)
for i in 1:n-1
di = deepcopy(d)
pop!(di[:args])
args = Tuple(gensym("arg$j") for j in 1:i)
push!(di[:args], args...)
pushfirst!(di[:body].args, :($args_symbol = $args))
push!(fdefs.args, combinedef(di))
end
di = deepcopy(d)
pop!(di[:args])
args = tuple((gensym() for j in 1:n)..., :($(gensym("args"))...))
push!(di[:args], args...)
pushfirst!(di[:body].args, :($args_symbol = $(Expr(:tuple, args...))))
push!(fdefs.args, combinedef(di))
esc(fdefs)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment