julia 生成带有符号的表达式

julia generate expression with symbol in it

我需要生成一个 call Expr,其中一个关键字参数是一个符号。我可以像这样明确地输入它:

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

注意设置为符号 :b

的关键字参数 a

我想做的是以编程方式生成此表达式,其中 :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

但我没有得到一个值为 Symbol uQuoteNode,而是得到了符号 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)