Search code examples
macrosjuliaexpressionmetaprogramming

is it possible to execute a code inside an expression?


I have this macro:

 macro superM(name, field)
    :(struct $(esc(name))
    map(x -> (for i = 1:length(x) return  $(esc(x[i][1])) end),field.args)
    end)  
end

@superM test ((arg1,2),(arg2,4))

I just want to map the second argument to get the arguments for the struct in the macro. So, this macro should define a struct like this:

struct test
 arg1 
 arg2
end

As I understand that I'm writing the map function inside an expression, that means my code will not execute and the map function will be a part of my struct. But is there any way to execute the map function inside the expression? Here I got error: LoadError: UndefVarError: x not defined


Solution

  • You could try:

    macro superM(name, field)
        code = Base.remove_linenums!(quote
               struct $name
               end
              end)
        append!(code.args[1].args[3].args,[f.args[1] for f in field.args])
        code
    end
    

    Now give it a spin:

    julia> @macroexpand @superM(mysss,((field1,1),(field2,2)))
    quote
        struct mysss
            field1
            field2
        end
    end
    
    julia> @superM(mysss,((field1,1),(field2,2)))
    
    julia> mysss(1,5)
    mysss(1, 5)
    
    julia> dump(mysss(1,"ala"))
    mysss
      field1: Int64 1
      field2: String "ala"