Pull to refresh

Comments 15

Автор, хрошее дело делаете, спасибо.
Народ, поделитесь опытом, для каких задач кто применяет Erlang (желательно поподробней, с примерами кода)?
На сколько я знаю, серверная часть Яндекс диска на Erlang ездит. Хотя могу ошибаться.
На Erlange сделан webDAV интерфейс Яндекс.Диска. А остальная серверная часть — в основном на Питоне
В телекоме используется для роутинга пакетов (как я понял, для этого Эрланг и разработали), в серверах приложений (слышал, что кое-где на эрланге пишут сервер для онлайн игры). В общем, везде, где нужно что-то быстро обработать поточно, причём массово, высокопараллельно и супернадёжно.
Пишем процессинг платежных транзакций (и кучу вспомогательных вещей). Но мы не одни такие. Шведская Klarna пока еще тоже на эрланге сидит. Кроме того (из того, что еще не отметили), эрланг применяют в hft (Exante), в чем-то связаном с рекламой (насколько я понимаю, Campanja), играми (MochiMedia), интерактивным Web (Echo), видеостриммингом (Flussonic, бывший erlyvideo, код, например, тут можно посмотреть).
Почему Klarna «пока ещё»? Известны какие-то планы?
Да, у них там смутное время сейчас. Есть противоречивые сведения, но не мне рассказывать о положении вещей у них. Лучше поинтересоваться непосредственно у инсайдеров. dmitriid например.
Единственное — посоветовал бы в примерах писать не ModuleName:FunctionName(Arg1, Arg2, ..., ArgN) а module_name:function_name(Arg1, Arg2, ..., ArgN).
Первый вариант обычно понимается, как динамически вызываемая функция, типа:
call_function(ModuleName, FunctionName) ->
    ModuleName:FunctionName().


Я лично с Erlang начал знакомство тут www.rsdn.ru/article/erlang/GettingStartedWithErlang.xml — перевод официального tutorial.
Я тоже с этой статьи начинал — буквально за день въехал в синтаксис. Потом Армстронга и вперед.
А есть ли возможность сделать «return» в середине функции?
Именно return нет. Но, если требуется прервать выполнение из за ошибки (и при этом не выпустить ошибку наружу), можно слепить конструкцию из catch и begin… end например (но это плохой пример, потому что можно и нужно обойтись и без этого трюка, но идея должна быть ясна).
foo(Bar) ->
    catch begin
        Zoo = do_some_very_necessary_work(),
        if 
          Bar < 5 -> throw({error, invalid_bar});
          true -> ok
        end,
        Result = do_bar(Bar, Zoo),
        {ok, Result}
    end.


А насчет return из середины при happy path я не припомню, чтобы это пригождалось. Всегда находится способ (матч в голове клоза, вынести логику в лямбду или отдельную функцию) не прибегать к этому. Получается элегантнее.
Можно разбить тело функции на две логические ветви (как раз будет рассмотрено в следующей главе). Тогда перед выполнением функции производится проверка и выполняется та часть, которая нужна. И результат возвращается из нее.
Нет, нельзя. Можно бросить эксепшен, а в вызывающей функции его поймать, но как-то это не очень красиво получается, и вообще не erlang-way

На практике этот приводит к разбиению кода на множество функций по 2-3 строки, что бы не вылезать за 2 уровня в дереве case'ов
Sign up to leave a comment.

Articles