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
Posted by Andrew Dashin
on May 27, 2009
Натолкнулся на такую вот статью, в которой описывается весь процесс. Но как всегда засада - если чётко следовать, то ничего не получится. По сему коротко изложу процесс:
Перейдём в директорию, предназначенную для подобных экспериментов
Вытянем код из репозитория и выполним 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
Ну, не каждый день. Но одну художественную и одну технической направленности в неделю я попробую читать. Продержусь ли хоть неделю?
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 - вещь действительно интересная, правда не в коммерческом плане.
Posted by Andrew Dashin
on April 09, 2009
Недавно думал о том, что было-бы здорово иметь гибрид двух языков - Erlang и Lisp. И как всегда - колесо оказывается изобрёл уже кто-то другой.
Termite - реализация идеи “распределённого программирования” на диалекте языка Scheme - Gambit-C. Gambit-C выбран не с проста, во-первых, это весьма качественная реализация, во-вторых, Gambit-C создан в Монреальском Институте, так же как и Termite.
Изначально хотелось написать большую статью, с кучей примеров и прочим, но ограничусь лишь одним примером, взятым из официальной документации и перечислением возможностей.
Итак, Termite умеет такие классные штуки, как:
- Легковесные процессы (достались в наследство от Gambit-C)
- Обмен сообщениями между процессами (каждый процесс имеет свой mailbox, откуда он может извлекать накопившиеся сообщения, посланные данному процессу)
- Обработка исключений (имеется два способа обработать исключение: с момента установки обработчика или с момента выбрасывания исключения)
- Pattern matching (реализовано только для выбора сообщения из mailbox-а)
- Удалённое создание процессов
Обещанный пример (взят из официальной документации):
(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 является сколь-нибудь живой и жизнеспособной.
Posted by Andrew Dashin
on March 24, 2009
Вчера в сети появилось интервью с Joe Armstrong.
Кому лень читать приведу суть:
- В связи со всплеском интереса к erlang, Джо Армстронга стали чаще приглашать на разнообразные мероприятия, связанные с этим языком. В результате появился опыт - не все приглашения теперь он будет принимать
- На улицах пока автографы не просят
- Не думает что программировать под веб на эрланге является хорошей идеей.
- Язык Reia Джо Армстонг не пробовал, но он ему всё равно не нравится
- Джо Армстронг не любит records в erlang и мечтает чем-нибудь заменить
- Он придумал не только erlang, но только erlang выжил
- Любит Haskell
- Хочет написать ещё каких-нибудь книжек про программирование