【发布时间】:2018-10-05 12:58:35
【问题描述】:
如果你有两个模块,A 和 B,它们应该包含两个函数,bar 和 baz,它们依赖于彼此的模块,这可以通过首先将函数声明为空来实现,然后之后添加方法:
module Wrapper
module A
const x = 1
function bar end
end # module A
module B
const x = 2
function baz end
end # module B
import .A: bar
import .B: baz
bar(expr) = quote
println("bar", $(B.x))
$expr
end
baz(expr) = quote
println("baz", $(A.x))
$expr
end
end # module Wrapper
但是,我有一种情况,A 和 B 包含依赖于 bar 和 baz 的宏。由于(我认为?)我不能从模块外部向宏添加方法,因此必须在内部声明它们。但后来我无法再规避循环导入了——以下失败是因为WARNING: could not import Wrapper.B into A,而B 在A 中未定义:
module Wrapper
module A
import ..Wrapper.B
const x = 1
macro foo(expr)
B.baz(expr)
end
function bar end
end # module A
module B
import ..Wrapper.A
const x = 2
macro foo(expr)
A.bar(expr)
end
function baz end
end # module B
import .A: bar
import .B: baz
bar(expr) = quote
println("bar", $(B.x))
$expr
end
baz(expr) = quote
println("baz", $(A.x))
$expr
end
end # module Wrapper
有没有可能如何实现这种模式? (只是重命名 foos 并将它们移动到 Wrapper 并不是一个真正的选择,因为我希望名称相同......)。
【问题讨论】:
标签: module julia metaprogramming