пятница, 31 августа 2012 г.

Система модулей в Julia

Т.к. в основной документации Julia нету описания модулей, то сделаю маленький обзор исходя из этого топика рассылки.

Для создания модуля используется следующая конструкция:

module ModuleName
    #Some code
end

Просто и очевидно.

Теперь рассмотрим такой код:

module HELLO
    print("hello")  # Ошибка!
end

Должно работать? А вот и нет. Теперь стандартные функции перенесены в модуль Base, который не импортируется по умолчанию, поэтому Julia скажет: "print not defined".

Правильно будет:

module HELLO
    import Base.*
    print("hello")
end

Что значит .* в данной записи? А значит оно вот что: "Из модуля Base экспортируются все символы, которые помечены как export". Как использовать export в своих модулях? Элементарно, пример:


module HELLO
    import Base.*
    export hello

    function hello()
        print("hello")
    end
end

Стоит заметить, что export может находится в любом месте модуля, а не только в начале.

Экспортировать можно и отдельные символы с помощью конструкций вида import  Foo.foo.

Так же стоит заметить, что в одном файле исходного кода может быть несколько модулей (в отличие от python).

Следует указать ещё одну интересную возможность модулей - ключевое слово include.

module TEST
    import Base.*


    include("foo.jl")
    include("baz.jl")
end


В модуле TEST будут присутствовать все символы, определяемые в foo.jl и baz.jl. Причём никто не запрещает делать include("some_file.jl") сразу в нескольких модулях.

И ещё один пример:

module T
    import Base.*
    export t1, t2

    function t1()
        print("t1")
    end

    function t2()
        print("t2")
    end
end


module T2
    import T.*

    export t2
    t1()
end


module Z
    import T2.*

    t2()
end


А вот Z.t1() будет ошибочно. Почему? Потому что всегда требуется явный экспорт символов.