【问题标题】:julia eval an expression including an escape variablejulia eval 一个包含转义变量的表达式
【发布时间】:2021-05-01 07:29:52
【问题描述】:

对以下表达式使用 eval 很简单:

exp = :(x + 1)
x = 1
eval(exp)

我不知道如何评估以下涉及转义变量的表达式:

x = 1
exp = :($(esc(x)) + 1)

exp 的转储给出:

head: Symbol call
args: Array{Any}((3,))
  1: Symbol +
  2: Expr
    head: Symbol escape
    args: Array{Any}((1,))
      1: Int64 1             <-- current value of x
  3: Int64 1

我想出了如何像这样替换转义的变量值:

exp.args[2].args[1] = 2

dump(exp) 现在是:

head: Symbol call
args: Array{Any}((3,))
  1: Symbol +
  2: Expr
    head: Symbol escape
    args: Array{Any}((1,))
      1: Int64 2            <-- Replaced value
  3: Int64 1

我遗漏了最后一步,尽管搜索了文档和 stackoverflow,但我还是找不到。

【问题讨论】:

    标签: julia expression eval metaprogramming


    【解决方案1】:

    我不确定你想要完成什么,但是esc 通常只在宏内部才有意义,所以如果有这样的对象,你需要将它包装在宏周围。

    julia> exp = :($(esc(x)) + 1)
    :($(Expr(:escape, 33)) + 1)
    
    julia> macro call_exp(); exp; end
    @call_exp (macro with 1 method)
    
    julia> x=33;
    
    julia> @call_exp
    34
    

    【讨论】:

    • 好吧,我假设@somemacro 以某种方式计算宏内部的表达式。它更多的是深入了解 while 事情是如何运作的,而不是实现特定的目标。我试图了解表达式是如何创建、评估、限定范围等的。所以,我希望有一个绕过使用宏的解决方案。
    • ?esc 的文档明确声明 Only valid in the context of an Expr returned from a macro 因此我猜你只能在宏中使用它
    猜你喜欢
    • 2020-05-23
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多