I realized this doesn't work well for me.

The problem with using @lazymod and splitting my "books" into different 
modules is that I have methods with the same name in the "book" modules.
This will cause conflicts and I won't get the methods when I import the 
second book module.

Maybe I could use https://github.com/davidagold/MetaMerge.jl but at this 
point it seems like an awful amount of work just to be able to do something 
as simple as not loading the whole package...

Assuming that I have a huge number of different types that all have the 
same parent abstract type. There is a method for each type operating on the 
type.

Is it right that there is no way to put this in a package and have a user 
only load part of the types and methods?



On Tuesday, May 5, 2015 at 6:52:24 PM UTC+2, Jameson wrote:
>
> Also see https://github.com/JuliaLang/julia/pull/6884
>
> On Tue, May 5, 2015 at 12:52 PM Kristoffer Carlsson <[email protected] 
> <javascript:>> wrote:
>
>> Thank you for the link. My current structure is now then:
>>
>> # MyPackage.jl
>> module MyPackage
>>
>> export foo, AbstractBook
>>
>> include("required.jl")
>> include("library.jl")
>> end
>>
>> # required.jl
>> abstract AbstractBook
>> foo(a::AbstractBook) = print(a)
>>
>> # library.jl
>> module Library
>>
>> using Requires
>>
>> @lazymod BookModule1 "book1.jl"
>> @lazymod BookModule" "book2.jl"
>>
>> end
>>
>>
>> # book1.jl
>> module BookModule1
>> using MyPackage
>> export Book1
>> type Book1 <: AbstractBook
>> end
>>
>> # book2.jl
>> module BookModule2
>> using MyPackage
>> export Book2
>> type Book2 <: AbstractBook
>> end
>>
>> I can then load the Book1Mod using
>>
>> julia> MyPackage.Library.bookmodule1()
>> MyPackage.Library.BookModule1
>>
>>
>> which is a little bit uglier than what I would like but it works!
>>
>> Thanks!
>>
>> // Kristoffer
>>
>> On Tuesday, May 5, 2015 at 6:12:35 PM UTC+2, Isaiah wrote:
>>
>>> Have a look at https://github.com/one-more-minute/Requires.jl
>>>
>>
>>> On Tue, May 5, 2015 at 12:04 PM, Kristoffer Carlsson <[email protected]
>>> > wrote:
>>>
>>>> I have a package where some functionality should always be loaded when 
>>>> writing the normal "using MyPackage" and some functionality needs to be 
>>>> explicitly loaded. The use case for me is that I have a library of 
>>>> different things (let's call them books) and it is likely that only a few 
>>>> books from this library are used and I want to reduce the loading time of 
>>>> the package.
>>>>
>>>> To make it concrete let's assume I currently have the following 
>>>> file/module structure:
>>>> # MyPackage.jl
>>>> module MyPackage
>>>> export foo
>>>> include("required.jl")
>>>> include("library.jl")
>>>> end
>>>>
>>>> # required.jl
>>>> abstract AbstractBook
>>>> foo(a::AbstractBook) = print(a)
>>>>
>>>> # library.jl
>>>>
>>>> include("book1.jl")
>>>> include("book2.jl")
>>>>
>>>> # book1.jl
>>>> type Book1 <: AbstractBook
>>>>
>>>> # book2.jl (oh boy...)
>>>> using Gadfly
>>>> using Winston
>>>> using Images
>>>> using PyCall
>>>> type Book2 <: AbstractBook
>>>>
>>>> Now, I want my usage of the package to look something like this:
>>>> using MyPackage # Loads everything required
>>>> using MyPackage.Library.Book1 # Only loads book1.jl, book2.jl is not 
>>>> touched, fast loading
>>>>
>>>> Foo(Book1())
>>>>
>>>> I guess I have to put my books into their own separate modules, akin:
>>>>
>>>> # MyPackage.jl
>>>> module MyPackage
>>>> export foo
>>>> include("required.jl")
>>>> end
>>>>
>>>> # required.jl
>>>> abstract AbstractBook
>>>> foo(a::AbstractBook) = print(a)
>>>>
>>>> # book1.jl
>>>> module BookModule1
>>>> using MyPackage
>>>> export Book1
>>>> type Book1 <: AbstractBook
>>>> end
>>>>
>>>> # book2.jl
>>>> module BookModule2
>>>> using MyPackage
>>>> export Book2
>>>> type Book2 <: AbstractBook
>>>> end
>>>>
>>>> But now there is no convenient way to load the book modules?
>>>>
>>>> Can anyone help me how to properly structure this? A link to a package 
>>>> that does this will likely work just fine.
>>>>
>>>> Best regards,
>>>> Kristoffer Carlsson
>>>>
>>>
>>>  

Reply via email to