В письме от Чтв, 12 Авг 2010, 15:17 Roman пишет:
--
Regards,
Anton Fedorov
Call2ru service
E-Mail: datac...@call2ru.com
Jabber: datac...@call2ru.com
ICQ: 272-35-262
Mobile: +7-913-925-7974 [SMS 24h, Call 05:00-19:00 MSKT (GMT+3)]
Встает один вопрос, получается эрланг некий
специфический язык все же ? Который хорош именно в решении проблем
одной области, коммуникации, веб, распределенные системы.
Я обычно это формулирую так: эрланг — лучший инструмент для создания
сетевых демонов, обслуживающих
большое количество statefull клиентов.
Использовать erlang для веб-сайтов или для бизнес-оперденей я бы подумал.
On Aug 12, 12:39 pm, Max Lapshin <max.laps...@gmail.com> wrote:
> 2010/8/12 Roman <felix...@gmail.com>:
>
> > Встает один вопрос, получается эрланг некий специфический язык все же ?
>
> Я обычно это формулирую так: эрланг -- лучший инструмент для создания
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Веб-приложени_е_, а не веб-приложения.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Без наследования, но с фактическими объектами и классами. Просто они в
эрланге сильно другие.
Объектная модель на Эрланге делается тривиально, но надо понять, что
есть как минимум две объектные модели. Одна известна лучше всего по
C++ или Java и предполагает одну нить управления, которая что-то
дёргает в объектах (multithreading не меняет эту логику, оно делает
лишь несколько их). Вторая - образца Simula/Smalltalk/etc. - это
модель рыб в аквариуме, которые плавают и пускают пузырьки независимо
друг от друга (на этом месте прошу закрыть глаза и представить себе
это), обменивающихся простыми сообщениями. Erlang отлично следует этой
модели, если объект == процесс, класс - или выделен явно как behavior,
или неявно используемым кодом. Инкапсуляция в этом случае очевидна,
наследование - делается кривовато через behavior или явно, полиморфизм
очевиден (какая нафиг разница, что внутри процесса, если он получает
стандартное сообщение).
Так что - функциональность не мешает объектности.:)
--
-netch-
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
А вот в ерланге как раз то самое, классическое. Правильное.
объекту? Банальный вызов процедур. Блокирующий. И никаких объектов --
обычные структуры/записи.
А вот в ерланге как раз то самое, классическое. Правильное.
Dmitry Belyaev
Я пару дней назад сел на питоне скрипт написать. Как я намучался из-за того, что в нем нет fold-а. Уже забыл, что такое цикл.
А ещё, а ещё у питона синтаксис странный и не читабельный!
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Только вот нет нигде гарантии что в коде коллеги что-то не поменяют
мутабельно. Наличие мутабельности в языке сильно снижает число
инвариантов, усложняет анализ и отладку кода.
Тем более, что мутабельность в питоне никак не ограничена, даже на
уровне типизации. Да и типизация там... Динамическая. Сочетание всего
этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.
Только вот нет нигде гарантии что в коде коллеги что-то не поменяютмутабельно. Наличие мутабельности в языке сильно снижает число
инвариантов, усложняет анализ и отладку кода.
Тем более, что мутабельность в питоне никак не ограничена, даже на
уровне типизации. Да и типизация там... Динамическая. Сочетание всего
этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Dmitry Belyaev
Также не то что не читабельность, а непонимабельность легко
достигается посредством мутабельности + динамической типизацией.
Массовым повторным использованием одной и той же переменной с разными
типами. Да хоть бы и в цикле -- одна и та же переменная, на каждой
итерации может легко менять свой тип, а не только значение. А то и по
нескольку раз за итерацию. Крута? Читабельность она нужна лишь в том
случае, если она способствует понимабельности. А тут она ей никак не
помогает и не способствует.
Ядрышко то гнилое.
> Очень удобно работать со строками кода - это маленький камешек в огород
> Эрланга, где используется три разных терминатора строк. То есть не всегда
> можно просто закомментировать строку, придется менять запятые/точки с
> зпт/точки.
Это да.
Прелесть эрланга как раз в том, что часто большую часть кода можно
вообще ни во что не оборачивать и программировать в стиле "Let it
fail".
В ерланге? Операторов? Как??
>> Тем более, что мутабельность в питоне никак не ограничена, даже на
>> уровне типизации. Да и типизация там... Динамическая. Сочетание всего
>> этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.
> В Эрланге тоже динамическая типизация - но это никому не мешает.
Мешает. Но существенно меньше т.к.:
1) Нет мутабельности.
2) otp с супервизорами и прочим let it fail'ом.
3) есть typer & dializer
4) Язык НАМНОГО проще.
> В переменную можно записать что угодно, но только 1 раз.
> Потоки процессы есть, если есть какой-то потенциально опасный участок кода,
> то оберните его в try...catch.
Или дайте же ему наконец упасть!
[..]
zealots are so zealots.
On Aug 12, 1:49 pm, Valentin Nechayev <net...@gmail.com> wrote:
> 2010/8/12 Roman <felix...@gmail.com>:
>> Только вот нет нигде гарантии что в коде коллеги что-то не поменяютВ ерланге? Операторов? Как??
>> мутабельно. Наличие мутабельности в языке сильно снижает число
>> инвариантов, усложняет анализ и отладку кода.
> Если коллеги в коде что-то там меняют, то они могут и операторов вам
> понаписать и все поломать.
> Эта проблема скорее организационная.
Или дайте же ему наконец упасть!
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Dmitry Belyaev
> Да, статическая типизация в эрланге - это было бы круто.Но профита с т.з. производительности небыло бы никакого, ибо таков beam.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Dmitry Belyaev
Dmitry Belyaev
Ага. Особенно возможность делать многострочные лямбда функции.
Впрочем, после отжига Гвидо стало ясно, что он вообще не вкурсе, что
такое анонимные функции и лямбда-счисление.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Гвидо -- ещё одна проблема питона на букву G? ;-)
А что за отжиг то?
Поищи. Он где-то ляпнул, что в питоне fold делается быстро, в десяток
строк кода, «не то что в этих ваших функциональных языках». Короче, он
просто не понимает, зачем нужны многострочные лямбды.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
2010/8/12 Max Lapshin <max.l...@gmail.com>:
Dmitry Belyaev
Смысл именовать то, что используется ровно один раз ровно в одном
месте и становится понятно только в контексте использования?
ты понимаешь разницу между замыканием и функцией?
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Dmitry Belyaev
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
В питоне функции замыкаются на лексическое окружение:
def make_adder(x):
def adder(y):
return x+y
return adder
>>> add5 = make_adder(5)
>>> add5(2)
7
construct_filter(L) -> Filter = fun (X) -> lists:member(X, L) end, % by using L in this fun, we construct closure Filter. construct_filter(SmallListOfSearchedElements).
7
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
> Понимаете, подход "сейчас тут сделаем что-то очень маленькое и крутое",
> очень часто ведет к говнокоду в перловом стиле, со всеми проблемами:
Нет. Здесь мы сделаем что-то очень маленькое и очень простое, ради
которого нет смысла заводить ни имени, ни коментария.
> - выясняется, что такой же функционал нужен еще где-то и начинается
> тиражирование этих функций
Во-первых всё что обобщается и тиражируется, обычно уже есть в
стандартной библиотеке вменяемого языка.
Во-вторых иногда тиражирование лучше чем вызов неведомой хрени непонятно откуда.
> - через полгода даже автор забывает что он хотел этим сказать
С фига ли? То что он хотел сказать явно написано вот прям здесь же,
где оно используется. Не нужно прыгать от куска кода к куску кода. Всё
очень удобно.
> - новым людям в команде нужно время чтобы в этом разобраться
Не. Новым людям нужно будет время чтобы хотя бы прочесть код когда
каждая мало-мальски функциональность вынесена в нечто именованное.
Чтение кода становится не линейным. По сути чтение идет в стиле
спагетти. Эдакий goto но не для исполнителя, а для читателя.
> - редко какой язык позволит такую трехэтажную конструкцию записать
> удобочитаемо - а значит ухудшается читаемость
То, что это не позволяет питон, не говорит о том, что это не возможно
в принципе :-)
См. например haskell, там всё очень читабельно в этом плане. Да и в
ерланге проблем особых нет.
Update: lambda, filter and map will stay (the latter two with small
changes, returning iterators instead of lists). Only reduce will be
removed from the 3.0 standard library. You can import it from
functools.
Так что ничего не будет выкинуто. Если конечно после 2005 года вновь
не заходило разговоров.
Так вот нет, это не замыкание частный случай функции, а функция -- это
такой частный случай замыкания,
которое имеет нулевую область видимости и присвоено какому-то идентификатору.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
funcs = {}
for i in range(10):
funcs[i] = lambda i: i
funcs[0]() # 9
funcs[1]() # 9
...
2010/8/12 Eugene Lisitsky <lisi...@gmail.com>:
--
Andrey Popp
phone: +7 911 740 24 91
e-mail: 8ma...@gmail.com
Нет здесь никакой проблемы, но надо понимать, что в момент
формирования замыкания запоминается не значение переменной, а ссылка
на её экземпляр в стеке. Поэтому нельзя порождать напрямую лямбдой,
надо вызвать функцию, у которой переменная будет аргументом, и в ней
уже породить замыкание.
Вообще это свойство всех языков группы (в Перле то же самое).
--
-netch-
Вот говорят питон читабельный, а я вот с первого раза ну нифига не
понял что тут происходит. Потом посмотрел немного доку и таки понял.
for i in range(10) # сколь я понял -- плохая практика, ибо range
создаст список. энергично. соответственно отхавают память там, где
хавать не было нужды.
Каким образом получаются
> funcs[0]() # 9
> funcs[1]() # 9
Я вообще не понял. Как там могут быть девятки то?
PS. Вначале долго думал зачем в лямбде i делят на i, потом дошло, что
это синтаксис такой. не очевидный.
Dmitry Belyaev
Да не, Лёш, я тоже считаю что код на питоне в среднем читабельнее чем
на многом другом.
В третьем питоне range() создаёт итератор.
>
> Каким образом получаются
>
> > funcs[0]() # 9
> > funcs[1]() # 9
>
> Я вообще не понял. Как там могут быть девятки то?
Зацепилась переменная, а не её значение. См. мой предыдущий
комментарий.
> PS. Вначале долго думал зачем в лямбде i делят на i, потом дошло, что
> это синтаксис такой. не очевидный.
Для лямбды - вполне очевидный.
Ужоз.
Если уметь с ним работать - никакого ужаса, зато много интересных
возможностей.:)
--
-netch-
Нифига себе нет проблемы. Предлагается, по сути, вручную копировать
весь необходимый контекст исполнения. Закат солнца в ручную получается
однако.
С тем же успехом можно таки да, именованную функцию вызывать.
А то, что у перла есть подобные проблемы -- нифига не оправдание.
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Cмотря что подразумевать под многим другим. Если мы смотрим в сторону
перла и Си, то таки да, вполне возможно. Если же в сторону языков с
нормальным синтаксисом, вроде Ады, или Модулы, Оберона, или даже
Haskell'я (у последнего сложность чтения исходников не связана с
синтаксисом), то таки нет. Собственно и у ерланга я не вижу проблем с
читабельностью. И мне лично разбираться в питоноисходниках существенно
сложнее чем в ерланговых. В т.ч. и по синтаксису.
Впрочем, мне сложно рассматривать читабельность в отрыве от
понимабельности кода.
Но в основном используется то 2.6 питон. А то и 2.5
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
> Cмотря что подразумевать под многим другим. Если мы смотрим в сторону
> перла и Си, то таки да, вполне возможно.
После прочтения исходников ffmpeg-а C уже не кажется таким монстром,
хотя конечно да.
> Если же в сторону языков с
> нормальным синтаксисом, вроде Ады, или Модулы, Оберона, или даже
> Haskell'я (у последнего сложность чтения исходников не связана с
> синтаксисом), то таки нет.
Давай всё таки говорить о языках, за написание программ на которых
сегодня платят деньги.
> Собственно и у ерланга я не вижу проблем с
> читабельностью. И мне лично разбираться в питоноисходниках существенно
> сложнее чем в ерланговых. В т.ч. и по синтаксису.
>
> Впрочем, мне сложно рассматривать читабельность в отрыве от
> понимабельности кода.
Ну да. erlang очень примитивный синтаксически и семантически язык, чем
и прекрасен.
А так — да, у меня за год работы с видео уже отошел на второй план
вопрос понимаемости кода, потому что какая разница на чём написан
демуксер транспортного потока, если это само по себе очень сложно!
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Стандартная отмазка перлистов, плюсистов и брейнфаковцев. :-)
Например такая интересная возможность, как прострелить себе ногу через
левое ухо в самый интересный момент.
PS. Да, я плюсист. В основном. ;-)
>> Если же в сторону языков с
>> нормальным синтаксисом, вроде Ады, или Модулы, Оберона, или даже
>> Haskell'я (у последнего сложность чтения исходников не связана с
>> синтаксисом), то таки нет.
> Давай всё таки говорить о языках, за написание программ на которых
> сегодня платят деньги.
А я про такие и говорю. Их платят. И даже таки прямо в России.
Впрочем, за Аду в россии возможно и не платят. Зато очень хорошо
платят в европе и США.
> Ну да. erlang очень примитивный синтаксически и семантически язык, чем
> и прекрасен.
> А так -- да, у меня за год работы с видео уже отошел на второй план
> вопрос понимаемости кода, потому что какая разница на чём написан
> демуксер транспортного потока, если это само по себе очень сложно!
Ну, недавно в конфе была же тема по этому поводу -- base64. 4ре
реализации на разных языках. Я спрашивал народ какая реализация 1)
читабельней 2) понимабельней. Впрочем, народ вяло отреагировал. Видать
было влом :-)
И кто бы говорил. В течение 30 лет пальму первенства самого кошмарного
функционального языка держал m4, но язык плюсовых шаблонов его
победил.
Возможностей прострелить себе все клетки и ткани одним выстрелом -
столько, что никакому Александреску не приснится.
"И эти люди запрещают мне ковырять в носу" (tm)
Стандартый дисклеймер прилагается:)
--
-netch-
Не понимаю смысла так долго обсуждать проблему эффективности примера,
приведённого в учебных целях для демонстрации совсем других
особенностей.
--
-netch-
Ой, а я где-то агитировал за плюсы? Нет, я могу конечно, но только за
отдельную плату.
И много его копировать-то? У вас замыкания на полсотни переменных?
> С тем же успехом можно таки да, именованную функцию вызывать.
Именованная функция полезна не потому, что так написал ВЦСПС, а
потому, что у неё есть имя, которое видно в отладочно-диагностических
средствах начиная со снятия бектрейса. Имя, а не странные зюки,
которым в трейсе показываются fun() эрланга и которые, если в функции
более одного fun(), заставляют любого поседеть (особенно когда лишний
fun() сгенерирован компилятором).
> А то, что у перла есть подобные проблемы -- нифига не оправдание.
Эти проблемы у всех. А в эрланге они замаскированы только потому, что
там "переменные" не меняются.
--
-netch-
>> С тем же успехом можно таки да, именованную функцию вызывать.
> Именованная функция полезна не потому, что так написал ВЦСПС, а
> потому, что у неё есть имя, которое видно в отладочно-диагностических
> средствах начиная со снятия бектрейса. Имя, а не странные зюки,
> которым в трейсе показываются fun() эрланга и которые, если в функции
> более одного fun(), заставляют любого поседеть (особенно когда лишний
> fun() сгенерирован компилятором).
Это проблема отладочных средств, которые ниасиливают выдать номер
строки кода где объявлена функция.
>> А то, что у перла есть подобные проблемы -- нифига не оправдание.
> Эти проблемы у всех. А в эрланге они замаскированы только потому, что
> там "переменные" не меняются.
Это не так. Тот же пример с циклом вполне себе реализуется на ерланге
через хвостовую рекурсию. "переменная" цикла будет вполне себе
меняться от итерации к итерации. Захват контекста будет выполнен
вполне корректно.
Никакой маскировки.
А с переменными здесь не все круто - общая область видимости на всю
функцию иногда мешает (особенно в лесу из case-ов).
Вот были бы модификаторы матчинга для бинда имени к значению или
получения значения по имени.
...
A = calc1(),
A = calc2()
Для того, чтобы понять, что первая строчка - это биндинг, необходимо
делать поиск по коду, а не встречается ли где-то выше такое имя.
Насколько лучше было бы иметь модификатор к имени, который бы сразу
говорил о биндинге значения:
?A = calc1(),
A = calc1()
Dmitry Belyaev
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru
Dmitry Belyaev
+100.
А ещё хорошо бы иметь аналог f() для кода. Пусть даже только на
линейных участках, всё равно хлеб.
-netch-
Нет, если оказывается, что компилятор переделал lists:map() в
comprehension или аналогичное преобразование - то функция куда-то
исчезает, то появляется.
> Для того, чтобы понять, что первая строчка - это биндинг, необходимо делать
> поиск по коду, а не встречается ли где-то выше такое имя. Насколько лучше
> было бы иметь модификатор к имени, который бы сразу говорил о биндинге
> значения:
> ?A = calc1(),
> A = calc1()
Ну я во втором случае бы явно писал комментарий про проверку с вылетом.
Не основное средство, но помогает читать.
--
-netch-
Dmitry Belyaev