Macros only work on syntax but not on values, as you noted in your
post.  Here again:

julia> macro test(args...)
       @show args
       :()
       end

julia> @test k[5] u[i]
args = (:(k[5]),:(u[i]))
()

Macros are processed during parsing of the source, no values exists at
that point.  Jacob had a good short talk on this:
https://youtu.be/RYZkHudRTvI?list=PLP8iPy9hna6Sdx4soiGrSefrmOPdUWixM

Anyway, you could use this instead:

julia> function makefn(fname,label)
         quote
           function $fname()
             label
           end
           export $fname
         end
       end
makefn (generic function with 1 method)

julia> cmds = Dict{Symbol,Symbol}(
        :L => :leech,  :R => :raise
        )
Dict{Symbol,Symbol} with 2 entries:
  :R => :raise
  :L => :leech

julia> for kv in cmds
       @eval $(makefn(kv[2],kv[1]))
       end

julia> raise
raise (generic function with 1 method)


On Thu, 2016-02-11 at 22:37, Julia Tylors <juliatyl...@gmail.com> wrote:
> Hi;
>
>
> I am having a problem of calling a macro with predetermined values from a
> Dictionary.
> How do i solve this problem?
>
> Thanks
>
>
> module X
> const cmds = Dict{Symbol,Symbol}(
> :L => :leech,  :R => :raise
> )
>
> macro fun_gen(fname,label)
> efname = esc(fname)
> elabel = esc(label)
> quote
> function $(efname)()
> $elabel
> end
> export $(efname)
> end
> end
>
> for kv in cmds
> @fun_gen kv[2] kv[1]
> end
> end
>
> but this doesn't work.
>
> because @fun_gen exactly takes them as kv[2] kv[1]
>
> How can i do this?
> and what is the exact problem here?
>
> Thanks

Reply via email to