Phu*_*uoc 5 metaprogramming julia
我想创建一个引号,它将符号: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
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
quote
a = []
push!(a, :abc)
a
end
Run Code Online (Sandbox Code Playgroud)
您需要添加另一层报价,使用$(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
Run Code Online (Sandbox Code Playgroud)
建立:
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
Run Code Online (Sandbox Code Playgroud)
推!:
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
Run Code Online (Sandbox Code Playgroud)
EVAL:
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
Run Code Online (Sandbox Code Playgroud)
固定:
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
Run Code Online (Sandbox Code Playgroud)
最后:
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
Run Code Online (Sandbox Code Playgroud)