пятница, 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() будет ошибочно. Почему? Потому что всегда требуется явный экспорт символов.

суббота, 3 марта 2012 г.

Вернулся из спячки

Что-то я давно ничего не писал. Буду исправляться.

За последнее время я слегка разочаровался в F# и находился в неком поиске себя и тех инструментов, которые мне было бы интересно изучить и использовать.

Наверно стоит сказать пару слов почему я отказался от F#.


  • Плохой компилятор. В общем то всё хорошо, но дьявол кроется в мелочах. И одна из этих мелочей -  rec. Нет, он честно раскрывается в цикл, когда может, вот только когда функция чуть побольше пары строк, то уследить за тем, чтобы все рекурсивные вызовы были правильно сделаны не всегда получается. Ну и следовательно приходится ловить StackOverflow exception в рантайме. Не весело в общем.
  • Синтаксис. Да он кажется красивым, но это ровно до того момента, пока ты не пишешь чего-либо больше сотни строк (и не вылизываешь их по пол дня). А чем больше кода, тем стремительнее он пытается превратиться в кашу. Из этого следуют две следующие проблемы.
  • Выразительность кода на F# иногда может сыграть с программистом в довольно плохую шутку. Выразительность усложняет код, т.е. вносить правку в F# код значительно сложнее, чем в C/C++/C#/python код. Не потому, что сложнее написать пару символов, а потому что приходится дольше вникать в кусок кода, чтобы понять, где нужно поправить.
  • Синтаксис F# сложен, при этом в компиляторе есть косяки и не все заявленные в том же MSDN фичи работают + проблемы с автовыводом типов (приходится иногда ручками прописывать, либо изменять код на аналогичный, но для которого типы выводятся). Это заставляется писать более "грязный" код.
В общем и целом я отношусь к F# положительно, но пока буду ждать, как будут развиваться компилятор и среда разработки под него. 

Ах да, на НГ игрался с Mailbox + ZMQ, получилось забавно, хотя пришлось дополнительно использовать стандартные Thread для запуска ZMQ сокетов, т.к. Mailbox довольно мутно рулит потоками и, по умолчанию, должен использовать однопоточную обработку сообщений.


В любом случае сейчас я с .Net и C#/F# не работаю. Пересел на Java + Clojure и раскуриваю Gephi и gephi-toolkit, хотя качество документации к ним не фонтан. Первые пробы Clojure оказались довольно неплохи. Важным оказалось то, что после F# я смог быстро адаптироваться к recur. Что же, попробую заставить себя перевести https://github.com/gephi/gephi-toolkit-demos на Clojure, главное чтобы запала хватило :)