宏中的变量范围问题

如果在 main 中定义,我有一个宏可以工作。

macro check_set(d,v)
    nm = string(v)
    quote
        global $v
        if haskey($d,$nm)
            $v = $d[$nm]
        end
    end
end

但是,当我将它放在一个模块中(在模块内部定义的宏)以在函数中使用(也在模块内部定义)时,我会遇到范围问题。

export setVars

function setVars(val::Dict)
   global max_iter
   @check_set val max_iter
end

在 main 中,我按预期调用setVars(config)whereconfig是一本字典。我得到:

错误:UndefVarError:val 未定义

添加@macroexpand我看到:

begin
    #= /home/dpazzula/Documents/Stuff/src/Stuff.jl:156 =#
    global max_iter
    #= /home/dpazzula/Documents/Stuff/src/Stuff.jl:157 =#
    if Stuff.haskey(Stuff.val, "max_iter")
        #= /home/dpazzula/Documents/Stuff/src/Stuff.jl:158 =#
        Stuff.max_iter = Stuff.val["max_iter"]
    end
end

所以 ERROR 是有道理的,它正在寻找Stuff.val何时val局部作用于函数。

我如何让它寻找本地范围的val

以上是宏中的变量范围问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>