【问题标题】:How to interpolate a symbol as a Symbol in a Julia Expr?如何在 Julia Expr 中插入符号作为符号?
【发布时间】:2018-06-24 16:10:36
【问题描述】:

我想创建一个引号,它将符号:abc 保存在变量x 中,并将其推入数组a。但是我只能得到变量abc:$x 的语法似乎不正确(不是我想要的)。这样做的语法是什么?:

julia> x = :abc
julia> expr = quote
         a = []
         push!(a, $x)
         push!(a, :($x))
         push!(a, :$x)
         a
       end
quote  
    a = [] 
    push!(a, abc) 
    push!(a, $(Expr(:quote, :($(Expr(:$, :x))))))
    push!(a, :$ * x) 
    a
end

想要的输出是:

quote  
    a = [] 
    push!(a, :abc) 
    a
end

【问题讨论】:

  • push!(a, $(Meta.quot(x)))
  • 有效!非常感谢。
  • 还有,没有特殊功能:push!(a, $(Expr(:quote,x)))
  • 它也可以。谢谢。请把它放在答案中,以便我接受。

标签: julia metaprogramming


【解决方案1】:

你需要再增加一层引用,使用$(Meta.quot(:abc)),相当于$(Expr(:quote, :abc))

使用:

              _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.6.2 (2017-12-13 18:08 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org/ release
|__/                   |  x86_64-pc-linux-gnu

设置:

julia> x = :abc
:abc

julia> es = [x, :x, :(:x), Expr(:quote, x), Meta.quot(x)]    # :(x) is parsed as :x
5-element Array{Any,1}:                                  
 :abc                                                    
 :x                                                      
 :(:x)                                                   
 :(:abc)                                                 
 :(:abc)                                                 

julia> blk = Expr(:block)
quote
end

推!

julia> push!(blk.args, :(a = []))
1-element Array{Any,1}:
 :(a = [])

julia> blk
quote
    a = []
end

julia> for e in es
           push!(blk.args, :(push!(a, $e)))
       end

julia> blk
quote
    a = []
    push!(a, abc)
    push!(a, x)
    push!(a, :x)
    push!(a, :abc)
    push!(a, :abc)
end

julia> push!(blk.args, :a)
7-element Array{Any,1}:
 :(a = [])
 :(push!(a, abc))
 :(push!(a, x))
 :(push!(a, :x))
 :(push!(a, :abc))
 :(push!(a, :abc))
 :a

评估:

julia> blk
quote
    a = []
    push!(a, abc)
    push!(a, x)
    push!(a, :x)
    push!(a, :abc)
    push!(a, :abc)
    a
end

julia> eval(ans)
ERROR: UndefVarError: abc not defined
Stacktrace:
 [1] eval(::Module, ::Any) at ./boot.jl:235
 [2] eval(::Any) at ./boot.jl:234

修复:

julia> deleteat!(blk.args, 2)
6-element Array{Any,1}:
 :(a = [])
 :(push!(a, x))
 :(push!(a, :x))
 :(push!(a, :abc))
 :(push!(a, :abc))
 :a

julia> blk
quote
    a = []
    push!(a, x)
    push!(a, :x)
    push!(a, :abc)
    push!(a, :abc)
    a
end

julia> eval(ans)
4-element Array{Any,1}:
 :abc
 :x
 :abc
 :abc

最后:

julia> using Base.Meta: quot

julia> x = :abc
:abc

julia> expr = quote
           a = []
           push!(a, $(quot(x)))
           a
       end
quote
    #= REPL[16]:2 =#
    a = []
    #= REPL[16]:3 =#
    push!(a, :abc)
    #= REPL[16]:4 =#
    a
end

julia> eval(ans)
1-element Array{Any,1}:
 :abc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2020-12-19
    相关资源
    最近更新 更多