https://github.com/JuliaLang/julia/pull/13123 ์ ๋ฐ๋ผ ์ธํฐํ์ด์ค๋ฅผ invoke
๋ก ๋ง๋ค๊ณ ๋ ์ง๊ด์ ์ผ๋ก ๋ง๋๋ @supercall
๋งคํฌ๋ก๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ด ํ์ฌ ๊ตฌํ:
macro callsuper(ex)
ex.head == :call || error("<strong i="9">@invoke</strong> requires a call expression")
args = ex.args[2:end]
types = Symbol[]
vals = Symbol[]
blk = quote end
for arg in args
val = gensym()
typ = gensym()
push!(vals, val)
push!(types, typ)
if isa(arg,Expr) && arg.head == :(::) && length(arg.args) == 2
push!(blk.args, :($typ = $(esc(arg.args[2]))))
push!(blk.args, :($val = $(esc(arg.args[1]))::$typ))
else
push!(blk.args, :($val = $(esc(arg))))
push!(blk.args, :($typ = typeof($val)))
end
end
push!(blk.args, :(invoke($(esc(ex.args[1])), ($(types...),), $(vals...))))
return blk
end
ํค์๋ ์ธ์์ ๋ํ ์ง์์ https://github.com/JuliaLang/julia/pull/11165 ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค
invoke์ ์ฌ์ฉ๋ ์ ํ์ ์ค์ ๋ก ์ ๊ณต๋ ๊ฐ์ ์์ ์ ํ์ด์ด์ผ ํฉ๋๊น?
๋๋ <strong i="5">@invoke</strong> foo(x, y::T)
๊ฐ invoke(foo, (typeof(x), T), x,y)
๋ฐ๋ ์ ์์ต๋๋ค. ์ฆ, ์ํ๋ ํธ์ถ ์๋ช
์ ๋ํ๋ด๊ธฐ ์ํด typeasserts๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก 1.0 ์ดํ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. Triage๋ ๋ํ 1.0์ ๋ํด invoke
๋ฅผ ์ ๊ฑฐํ ๊ฒ ๊ฐ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋
<strong i="5">@invoke</strong> foo(x, y::T)
๊ฐinvoke(foo, (typeof(x), T), x,y)
๋ฐ๋ ์ ์์ต๋๋ค. ์ฆ, ์ํ๋ ํธ์ถ ์๋ช ์ ๋ํ๋ด๊ธฐ ์ํด typeasserts๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.