dan*_*man 4 symbols metaprogramming julia
我需要生成一个callExpr,其中关键字参数之一是符号。我可以像这样明确地输入它:
julia> dump(:(func(something; a=:b)))
Expr
head: Symbol call
args: Array{Any}((3,))
1: Symbol func
2: Expr
head: Symbol parameters
args: Array{Any}((1,))
1: Expr
head: Symbol kw
args: Array{Any}((2,))
1: Symbol a
2: QuoteNode
value: Symbol b
3: Symbol something
Run Code Online (Sandbox Code Playgroud)
a请注意设置为符号的关键字参数:b
我想要做的是以编程方式生成这个表达式,其中该:b部分是从某个变量(例如 )插值得到的x。
我试过这个
julia> x = :u
:u
julia> dump(:(func(something; a=$(x))))
Expr
head: Symbol call
args: Array{Any}((3,))
1: Symbol func
2: Expr
head: Symbol parameters
args: Array{Any}((1,))
1: Expr
head: Symbol kw
args: Array{Any}((2,))
1: Symbol a
2: Symbol u
3: Symbol something
Run Code Online (Sandbox Code Playgroud)
但我没有得到 aQuoteNode的值,而是Symbol u得到了符号 u。这不起作用,因为当我评估表达式时,它会查找变量,u但它应该只是插入Symbol u. 我尝试过一些其他的事情,但无法让它发挥作用。谢谢
您可以手动包装x或QuoteNode使用Meta.quot(这会产生Expr(:quote, ...)):
julia> x = :u;
julia> dump(:(func(something; a=$(QuoteNode(x)))))
Expr
head: Symbol call
args: Array{Any}((3,))
1: Symbol func
2: Expr
head: Symbol parameters
args: Array{Any}((1,))
1: Expr
head: Symbol kw
args: Array{Any}((2,))
1: Symbol a
2: QuoteNode
value: Symbol u
3: Symbol something
julia> func(x; a) = x, a
func (generic function with 1 method)
julia> eval(:(func(something; a=$(QuoteNode(x)))))
(something, :u)
julia> eval(:(func(something; a=$(Meta.quot(x)))))
(something, :u)
Run Code Online (Sandbox Code Playgroud)