Y-combinator на Erlang 1

Posted by Andrew Dashin on May 28, 2009

В Erlang нету циклов, в связи с чем используется рекурсия. Но вот если вдруг необходимо создать анонимную рекурсивную функцию, вот тут появляется проблема. Но выход есть - использование Y Combinator
Простой пример: подсчитать сумму чисел от 0 до N

#!/usr/bin/env escript

main([]) ->
    io:format("~w\n", [(y(sum()))(5)]),
    halt(1).
   
y(X) ->
  F = fun (P) -> X(fun (A) -> (P(P))(A) end) end,
  F(F).

sum() ->
    fun (FA) ->
       fun (N) ->
            if (N == 0) -> 0;
               true -> N + FA(N-1)
            end
        end
    end.

Так как речь об анонимности идёт, то можно заменить на следующий код:

#!/usr/bin/env escript

main([]) ->
    io:format("~w\n", [(y(fun (FA) ->
       fun (N) ->
            if (N == 0) -> 0;
               true -> N + FA(N-1)
            end
        end
    end))(5)]),
    halt(1).
   
y(X) ->
  F = fun (P) -> X(fun (A) -> (P(P))(A) end) end,
  F(F).

Дополнительно по теме:

[1] The Why of Y
[2] That about wraps it up

Erlang + Maven за 5 минут

Posted by Andrew Dashin on May 27, 2009

Натолкнулся на такую вот статью, в которой описывается весь процесс. Но как всегда засада - если чётко следовать, то ничего не получится. По сему коротко изложу процесс:

Перейдём в директорию, предназначенную для подобных экспериментов

cd /opt/devel

Вытянем код из репозитория и выполним install

svn co https://svn.sourceforge.net/svnroot/maven-erlang/ maven-erlang
cd maven-erlang/maven-erlang/
mvn install -Dmaven.test.skip

Затем переместим свежескомпилированные плагины туда, где им место

cd ~/.m2/repository
mkdir org/erlang
mkdir org/erlang/maven
cp -R net/sf/maven-erlang/ org/erlang/maven/

И всё, теперь можно пробовать создавать Erlang-приложения:

mvn archetype:create -DarchetypeGroupId=org.erlang.maven -DarchetypeArtifactId=erlang-archetype -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=Test -DartifactId=Test

Каждый день новая книга

Posted by Andrew Dashin on May 19, 2009

Ну, не каждый день. Но одну художественную и одну технической направленности в неделю я попробую читать. Продержусь ли хоть неделю? :-)

Erlang со вкусом Lisp

Posted by Andrew Dashin on April 16, 2009

Бывает эрлангоподобный Scheme, а бывает и наоборот. LFE - Lisp Flavoured Erlang - Lisp-машина, написанная на erlang. Хотя это как раз не полноценный Lisp, а скорей полноценный Erlang с Lisp-like синтаксисом (Lisp-2). Проект крайне интересный.

Дополнительная информация есть здесь. Но прилагаю короткую инструкцию по установке:

macdashin:~ dashin$ git clone git://github.com/rvirding/lfe.git /opt/devel/lfe
macdashin:~ dashin$ erl -pa /opt/devel/lfe/ebin/ -noshell -noinput -s lfe_boot start
Erlang (BEAM) emulator version 5.6.4 [source] [smp:2] [async-threads:0] [kernel-poll:false]

LFE Shell V5.6.4 (abort with ^G)
> (: io format `"Hellau!~n")
Hellau!
ok
>

В отличии от Termite, в основе лежит настоящий Erlang и как следствие наследуются все его положительные стороны. В общем, LFE - вещь действительно интересная, правда не в коммерческом плане.

Scheme со вкусом Erlang

Posted by Andrew Dashin on April 09, 2009

Недавно думал о том, что было-бы здорово иметь гибрид двух языков - Erlang и Lisp. И как всегда - колесо оказывается изобрёл уже кто-то другой.

Termite - реализация идеи “распределённого программирования” на диалекте языка Scheme - Gambit-C. Gambit-C выбран не с проста, во-первых, это весьма качественная реализация, во-вторых, Gambit-C  создан в Монреальском Институте, так же как и Termite.

Изначально хотелось написать большую статью, с кучей примеров и прочим, но ограничусь лишь одним примером, взятым из официальной документации и перечислением возможностей.

Итак, Termite умеет такие классные штуки, как:

  1. Легковесные процессы (достались в наследство от Gambit-C)
  2. Обмен сообщениями между процессами (каждый процесс имеет свой mailbox, откуда он может извлекать накопившиеся сообщения, посланные данному процессу)
  3. Обработка исключений (имеется два способа обработать исключение: с момента установки обработчика или с момента выбрасывания исключения)
  4. Pattern matching (реализовано только для выбора сообщения из mailbox-а)
  5. Удалённое создание процессов

Обещанный пример (взят из официальной документации):

(define pong-server ; создаём новый процесс
    (spawn
        (lambda ()
            (let loop ()
                (let ((msg (?))) ; извлекаем сообщение из очереди
                    (if (and (list? msg)
                        (= (length msg) 2)
                        (pid? (car msg))
                        (eq? (cadr msg) `ping))
                    (let ((from (car msg)))
                        (! from `pong) ; отправляем ответ
                        (loop))
                (loop)))))))

(! pong-server (list (self) `ping)) ; отправляем сообщение,
                                    ; состоящее из идентификатора процесса
                                    ; отправителя и атома `ping
(?) ; получаем ответное сообщение

На основе перечисленных возможностей, в принципе можно строить отказоустойчивые распределённые приложения. Но пока к данному проекту проявляется исключительно академический интерес и в коммерческих проектах не используется.

ps На самом деле существует достаточное количество реализаций “эрланговости” на Scheme/Lisp, но на мой взгляд пока только Termite является сколь-нибудь живой и жизнеспособной.

Интервью с отцом Erlang или 8 фактов о Joe Armstrong

Posted by Andrew Dashin on March 24, 2009

Вчера в сети появилось интервью с Joe Armstrong.
Кому лень читать приведу суть:

  • В связи со всплеском интереса к erlang, Джо Армстронга стали чаще приглашать на разнообразные мероприятия, связанные с этим языком. В результате появился опыт - не все приглашения теперь он будет принимать
  • На улицах пока автографы не просят
  • Не думает что программировать под веб на эрланге является хорошей идеей.
  • Язык Reia Джо Армстонг не пробовал, но он ему всё равно не нравится
  • Джо Армстронг не любит records в erlang и мечтает чем-нибудь заменить
  • Он придумал не только erlang, но только erlang выжил
  • Любит Haskell
  • Хочет написать ещё каких-нибудь книжек про программирование

test 1

Posted by Andrew Dashin on March 15, 2009

some some some