Actually, I probably don't need a macro for this - all I need to do is to call both `workspace()` and `include(`~/.juliarc.jl`) :)
It turns out there's already a function that does most of the plumbing: `Base.load_juliarc()`. Thus, `workspace(); Base.load_juliarc()` does exactly what I need. I'll file a PR that makes `workspace()` call `load_juliarc()`, since it feels intuitive that it should, but since it's possible to just call both functions manually I'm in no way blocked by it :) Thanks for the help! // T On Sunday, July 26, 2015 at 1:48:43 AM UTC+2, David Gold wrote: > > Hmm... > > You could write an `@workspace` macro that calls `workspace()` and then > declares itself and the `quickload` macro... =p > > On Saturday, July 25, 2015 at 7:09:26 PM UTC-4, Tomas Lycken wrote: >> >> Fantastic - thanks a lot! >> >> The final form of the macro is then the following: >> >> macro quickload(m) >> _m = Expr(:quote, m) >> >> quote >> if isdefined(:LastMain) && isdefined(LastMain, $_m) >> using LastMain.$m >> else >> using $m >> end >> end >> end >> >> This works very well - except that I have to define it in each new >> workspace… Adding it to .juliarc.jl does make it available on start, but >> after workspace() it’s not available anymore, and kind-of looses its >> point… >> >> Any suggestions? >> >> // T >> >> On Sunday, July 26, 2015 at 12:58:28 AM UTC+2, David Gold wrote: >> >> 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 >>>> >>> >> >
