Julia 生成其中包含符号的表达式

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. 我尝试过一些其他的事情,但无法让它发挥作用。谢谢

pfi*_*seb 5

您可以手动包装xQuoteNode使用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)