ahm5
ahm5

Reputation: 683

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

Upvotes: 2

Views: 98

Answers (1)

Przemyslaw Szufel
Przemyslaw Szufel

Reputation: 42214

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"

Upvotes: 1

Related Questions