我可以通过声明
bar
和
baz
外部
A
和
B
,在子模块中使用并重新定义它们,然后最终实现它们的方法:
module Wrapper
function bar end
function baz end
module A
import ..Wrapper
const x = 1
macro foo(expr)
Wrapper.baz(expr)
end
const bar = Wrapper.bar
end # module A
module B
import ..Wrapper
const x = 2
macro foo(expr)
Wrapper.bar(expr)
end
const baz = Wrapper.baz
end # module B
import .A
import .B
bar(expr) = quote
println("bar", $(B.x))
$expr
end
baz(expr) = quote
println("baz", $(A.x))
$expr
end
end # module Wrapper
结果:
julia> Wrapper.A.bar(1)
quote
#= /tmp/test.jl:119 =#
println("bar", 2)
#= /tmp/test.jl:120 =#
1
end
julia> Wrapper.B.baz(1)
quote
#= /tmp/test.jl:124 =#
println("baz", 1)
#= /tmp/test.jl:125 =#
1
end
julia> Wrapper.B.@foo 1
bar2
1
julia> Wrapper.A.@foo 1
baz1
1