';UndefVarError:x未定义';在其模块外调用宏时(Julia v1.1)

';UndefVarError:x未定义';在其模块外调用宏时(Julia v1.1),julia,Julia,我试图编写一个宏,该宏调用同一模块中定义的函数(JuliaV1.1)。我总是得到错误:LoadError:UndevarError:myModel not defined 模块的代码如下(Models.jl): 宏的名称如下所示: include("Models.jl") using .Models x = [1, 2, 3] myModel = createmodel() @add_variable(myModel, x) show(myModel) 我知道这是一个逃避/卫生问题,但在尝

我试图编写一个宏,该宏调用同一模块中定义的函数(JuliaV1.1)。我总是得到
错误:LoadError:UndevarError:myModel not defined

模块的代码如下(Models.jl):

宏的名称如下所示:

include("Models.jl")
using .Models

x = [1, 2, 3]

myModel = createmodel()
@add_variable(myModel, x)
show(myModel)
我知道这是一个逃避/卫生问题,但在尝试了许多想法后,我没有得到预期的结果。到目前为止,我获得预期结果的唯一方法是在模块外定义宏以获得:
Model(Dict(“x”=>:x),Dict(:x=>[1,2,3])

您只需输入传递到宏中的变量:

macro add_variable(model, var)
    quote
        add_variable($(esc(model)), $(string(var)), $(esc(var)))
    end
end

宏中的所有名称都在其定义的模块的上下文中解析,除非您使用
esc
它们-使用
esc
它们在调用方的上下文中解析。您几乎总是希望
esc
宏的参数。像
add\u variable
这样的名称,您希望在定义宏本身的地方解析。

它可以工作!这很简单。。。非常感谢您的帮助和清晰的解释!
macro add_variable(model, var)
    quote
        add_variable($(esc(model)), $(string(var)), $(esc(var)))
    end
end