gpt4 book ai didi

julia - 'UndefVarError : x not defined' when calling a macro outside of its module (Julia v1. 1)

转载 作者:行者123 更新时间:2023-12-03 22:11:09 28 4
gpt4 key购买 nike

我正在尝试编写一个宏,该宏调用在同一模块中定义的函数(使用 Julia v1.1)。我总是得到 ERROR: LoadError: UndefVarError: myModel not defined .

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

module Models

export Model
export createmodel
export add_variable
export @add_variable

mutable struct Model
variable_symbols::Dict{String, Symbol}
variable_data::Dict{Symbol, Array{Int64, 1}}
Model(; variable_symbols = Dict([]), variable_data = Dict([])) =
new(variable_symbols, variable_data)
Model(variable_symbols, variable_data) = new(variable_symbols,
variable_data)
end

function createmodel()
model = Model()
return model
end

function add_variable(model, label::String, value::Array{Int64, 1})
symbol = Symbol(label)
model.variable_symbols[label] = Symbol(symbol)
model.variable_data[symbol] = value
end

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

end

宏调用如下:
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]))

最佳答案

你只需要 esc ape传入宏的变量:

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

宏中的所有名称都在其定义的模块的上下文中解析,除非您 esc他们 — 带有 esc它们是在调用者的上下文中解决的。你几乎总是想要 esc宏的参数。像 add_variable 这样的名字,但是,您希望在定义宏本身的位置进行解析。

关于julia - 'UndefVarError : x not defined' when calling a macro outside of its module (Julia v1. 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com