Until this gets merged, I'm finding that including
macro workspace()
return quote
workspace()
Base.load_juliarc()
end
end
in `~/.juliarc.jl` does the trick.
On Saturday, July 25, 2015 at 8:10:10 PM UTC-4, Tomas Lycken wrote:
>
> For reference: https://github.com/JuliaLang/julia/pull/12314
>
> On Sunday, July 26, 2015 at 2:04:01 AM UTC+2, Tomas Lycken wrote:
>>
>> 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
>>>>>>
>>>>>
>>>>
>>>