This seems to work:
julia> macro foo(bar)
_bar = Expr(:quote, bar)
res = Expr(:call, :isdefined, :($_bar))
return res
end
julia> macroexpand(:( @foo(baz) ))
:(isdefined(:baz))
On Saturday, July 25, 2015 at 6:30:08 PM UTC-4, Tomas Lycken wrote:
>
> Hi everybody!
>
> Is there a way to use a macro argument as an actual Symbol in the quote
> that the macro returns? The following can hopefully help explaining what I
> want:
>
> ```
> julia> macro foo(bar)
> :(isdefined($bar))
> end
>
> julia> macroexpand(:(@foo baz))
> :(isdefined(baz)) # I had hoped for :(isdefined(:baz)) - with :baz instead
> of baz
> ```
>
> I've tried various combinations of interpolation, escaping and passing
> arguments to `symbol`, but to no avail. Is there a way to accomplish this?
>
> --- Actual use case below ---
>
> I noticed a very common pattern in my workflow that I wanted to abstract
> away to make it quicker and easier:
>
> *I want to load module X. If it's in LastMain, it's much faster to get it
> from there, but otherwise I need to load it from scratch.*
>
> I can easily write code that does this. Take, for example, Gadfly:
>
> ```
> (isdefined(:LastMain) && isdefined(LastMain, :Gadfly) && using
> LastMain.Gadfly) || using Gadfly
> ```
>
> When I execute that code, Gadfly will load from LastMain if available
> there, and from scratch otherwise. And it won't error out if I haven't
> called `workspace()` at all yet. Perfect! But having to type that for each
> module I want to use the workflow for is a hassle - what if `@quickload
> Gadfly` would do the same thing? This is my attempt so far:
>
> ```
> julia> macro quickload(m)
> :((isdefined(:LastMain) && isdefined(LastMain, $m #= what do I put
> here?=#) && using LastMain.$m) || using $m)
> end
>
> julia> macroexpand(:(@quickload Gadfly))
> :((isdefined(:LastMain) && isdefined(LastMain,Gadfly #= <-- ...to make
> that :Gadfly instead of Gadfly =#)) && using LastMain.Gadfly || using
> Gadfly)
>
> ```
>
> Thanks in advance!
>
> // T
>