Если у вас есть два модуля, 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
Есть ли какая-либо возможность, как этот шаблон может быть реализован?(Просто переименовать foo
s и переместить их в Wrapper
на самом деле не вариант, так как я хочу, чтобы имена были одинаковыми ...).