[英]Julia local variable not defined in expression eval
鉴于以下功能,
function floop(exp)
a = 5
b = 10
ex = Expr(:call, :+, 1, exp);
return eval(ex);
end
如果我然后跑
floop(Symbol("b"))
我收到一条错误消息,说b
未定义。 为什么这不起作用? 我怎样才能使这项工作?
让 Julia 运行得很快的关键之一是 eval 始终在全局范围内运行。 这意味着它永远不能引用局部变量。
您可以执行类似于以下宏的操作,在扩展时根据静态已知的Symbol
选择一个值:
julia> macro floop(selector::QuoteNode)
choices = Dict(:a => 5, :b => 10)
ex = :(1 + $(choices[selector.value]))
return ex
end
@floop (macro with 1 method)
julia> @macroexpand @floop(:a)
:(1 + 5)
julia> @macroexpand @floop(:b)
:(1 + 10)
julia> @floop(:c)
ERROR: LoadError: KeyError: key :c not found
Stacktrace:
[1] getindex(::Dict{Symbol,Int64}, ::Symbol) at ./dict.jl:477
[2] @floop(::LineNumberNode, ::Module, ::QuoteNode) at ./REPL[27]:3
in expression starting at REPL[33]:1
julia> s = :a; @floop(s)
ERROR: LoadError: MethodError: no method matching @floop(::LineNumberNode, ::Module, ::Symbol)
Closest candidates are:
@floop(::LineNumberNode, ::Module, ::QuoteNode) at REPL[1]:2
in expression starting at REPL[2]:1
如何实际存储实际值取决于您。 const
全局字典将是一个选项,或者只是一个简单的if
链。
(实际上在QuoteNode
除了Symbol
之外还有其他东西,但是很难将它们拼接到宏调用中,而且它们也会引发KeyError
,所以我没有包含任何额外的处理。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.