es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

julia generar expresión con un símbolo dentro

Necesito generar una llamada Expr en la cual uno de los argumentos de clave sea un símbolo. Puedo escribirlo explícitamente así:

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

Note el argumento de clave a que se establece en el símbolo :b.

Lo que quiero hacer es generar esta expresión programáticamente donde la parte :b se interpola desde alguna variable, digamos x.

Intenté esto:

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

pero en lugar de obtener un QuoteNode con el valor Symbol u, solo obtengo el símbolo u. Esto no funcionará porque cuando evalué la expresión, busca la variable u pero solo debería estar insertando el símbolo u. He intentado algunas otras cosas, pero no puedo hacerlo funcionar.
Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede usar la función esc para interpolar el símbolo x en la expresión:

    julia> dump(:(func(algo; a=esc(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 algo
    

    Observe el QuoteNode con valor Symbol u, que es el símbolo interpolarado x.

Comments are closed.