繁体   English   中英

Julia 局部变量未在表达式 eval 中定义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM