Erlang и объектная модель

52 views
Skip to first unread message

Roman

unread,
Aug 12, 2010, 4:17:58 AM8/12/10
to Erlang в России
Всем привет
Недавно начал знакомиться с эрлангом. Концепция программирования,
конечно, очень сильно отличается от других языков. Immutable
переменные тоже очень хорошо, конкурентное программирование для многих
ядер - отлично. Встает один вопрос, получается эрланг некий
специфический язык все же ? Который хорош именно в решении проблем
одной области, коммуникации, веб, распределенные системы. А другие
языки универсальные, получается, и поэтому используют объектную
модель, классы, наследование и т.д. Мы знаем, что можно делать
программы в процедурном стиле, например на С, так же и здесь, тот же
как бы С, только функциональный язык. Или я все же не прав :)?

Anton Fedorov

unread,
Aug 12, 2010, 4:27:26 AM8/12/10
to erlang-...@googlegroups.com
Любой язык, экивалентный машине Тьюринга, является универсальным и позволяет
решить любую задачу.

В письме от Чтв, 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)]

Maxim Treskin

unread,
Aug 12, 2010, 4:37:50 AM8/12/10
to erlang-...@googlegroups.com

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

Только область эта большая-пребольшая.
Да, на ерланге не принято писать драйвера устройств, графические приложения и системные скрипты. Универсальных языков не бывает, каждый удобен лишь для одной или нескольких ниш.

--
Maxim Treskin

Max Lapshin

unread,
Aug 12, 2010, 4:39:17 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Roman <feli...@gmail.com>:

> Встает один вопрос, получается эрланг некий специфический язык все же ?

Я обычно это формулирую так: эрланг — лучший инструмент для создания
сетевых демонов, обслуживающих
большое количество statefull клиентов.

Использовать erlang для веб-сайтов или для бизнес-оперденей я бы подумал.

Roman

unread,
Aug 12, 2010, 5:22:26 AM8/12/10
to Erlang в России
Веб приложения уже есть
http://zotonic.com/ CMS достаточно функциональная. И даже веб
фреймворк http://nitrogenproject.com/.

On Aug 12, 12:39 pm, Max Lapshin <max.laps...@gmail.com> wrote:
> 2010/8/12 Roman <felix...@gmail.com>:


>
> > Встает один вопрос, получается эрланг некий специфический язык все же ?
>

> Я обычно это формулирую так: эрланг -- лучший инструмент для создания

Eugene Lisitsky

unread,
Aug 12, 2010, 5:27:26 AM8/12/10
to erlang-...@googlegroups.com
Вопрос же не только в наличии, кто-то вообще скажет, что лучший язык для веба - asm потому что страшно быстро все работает.
Вопрос в том, где оно удобнее, то есть где будет лучше соотношение "результат / усилия". Кстати, ПХП именно за счет этого резко рванул вперед и порвал перл и все прочее на массовом рынке. Потому что всякая простая ерунда делалась крайне просто. Для этого даже не требовалось подключать головной мозг, хватало одного спинного.
Не нужно ничего долго писать, комплилировать, инстраллировать, перезапускать и пр.


12 августа 2010 г. 13:22 пользователь Roman <feli...@gmail.com> написал:
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Max Lapshin

unread,
Aug 12, 2010, 5:28:03 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Roman <feli...@gmail.com>:

> Веб приложения уже есть
> http://zotonic.com/ CMS достаточно функциональная. И даже веб
> фреймворк http://nitrogenproject.com/.
>

Веб-приложени_е_, а не веб-приложения.

Roman

unread,
Aug 12, 2010, 5:41:32 AM8/12/10
to Erlang в России
И все же :) мне человеку знакомому с ruby, php и объектным подходом
непонятно как можно программировать без объектов и классов :) Видно,
что можно, но как будто бы есть какой то подвох :) может его нет, если
копну поглубже и освоюсь с языком.
Все что есть, насколько я понял это модули и records, records это
структуры данных и можно думать, что то похожее на класс, хотя могу
ошибаться опять же...

Eugene Lisitsky

unread,
Aug 12, 2010, 5:43:28 AM8/12/10
to erlang-...@googlegroups.com
Да, поначалу непривычно. :)
Здесь другой подход, надо голову повернуть на 90 градусов и вс станет логично :)
Мое мнение: не надо пытаться имитировать классы рекордами - надо пересматривать парадигму.

12 августа 2010 г. 13:41 пользователь Roman <feli...@gmail.com> написал:
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Max Lapshin

unread,
Aug 12, 2010, 5:47:28 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Roman <feli...@gmail.com>:

> И все же :) мне человеку знакомому с ruby, php и объектным подходом
> непонятно как можно программировать без объектов и классов :)

Без наследования, но с фактическими объектами и классами. Просто они в
эрланге сильно другие.

Valentin Nechayev

unread,
Aug 12, 2010, 5:49:19 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Roman <feli...@gmail.com>:

> А другие
> языки универсальные, получается, и поэтому используют объектную
> модель, классы, наследование и т.д. Мы знаем, что можно делать
> программы в процедурном стиле, например на С, так же и здесь, тот же
> как бы С, только функциональный язык. Или я все же не прав :)?

Объектная модель на Эрланге делается тривиально, но надо понять, что
есть как минимум две объектные модели. Одна известна лучше всего по
C++ или Java и предполагает одну нить управления, которая что-то
дёргает в объектах (multithreading не меняет эту логику, оно делает
лишь несколько их). Вторая - образца Simula/Smalltalk/etc. - это
модель рыб в аквариуме, которые плавают и пускают пузырьки независимо
друг от друга (на этом месте прошу закрыть глаза и представить себе
это), обменивающихся простыми сообщениями. Erlang отлично следует этой
модели, если объект == процесс, класс - или выделен явно как behavior,
или неявно используемым кодом. Инкапсуляция в этом случае очевидна,
наследование - делается кривовато через behavior или явно, полиморфизм
очевиден (какая нафиг разница, что внутри процесса, если он получает
стандартное сообщение).

Так что - функциональность не мешает объектности.:)

--
-netch-

Alexander Dergachev

unread,
Aug 12, 2010, 5:51:07 AM8/12/10
to erlang-...@googlegroups.com
%% some_module.erl
-module(some_module).
-export([]).

add(Pid, Data) ->
    Pid ! {add, Data}.

del(Pid, Data) ->
    Pid ! {del, Data}.

new() ->
    spawn(?MODULE, loop, []).


loop() ->
    receive
        {add, Data} ->
            bla1; %% напиши что нужно
        {del, Data} ->
            bla2; %% и тут
        _ ->
            blah  %% ну и тут конечно же...
    end,
    ok.

чем не объектный подход? использовать так:

Obj = some_module:new(),
some_module:add(Obj, "test"),
some_module:del(Obj, "test").

вполне себе объектно получается...

2010/8/12 Roman <feli...@gmail.com>
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
With Best Regards,
Alexander Dergachev

Alexey Veselovsky

unread,
Aug 12, 2010, 5:59:18 AM8/12/10
to erlang-...@googlegroups.com
В erlang'e правильная объектность. Ровно такая, какой она мне
представлялась, после того, как прочитал пачку вумных книжек по ООП.
Потом был С++ и Java, и было понимание, что на практике то всё
оказывается всё не так. Какие объекты? Какая посылка сообщений
объекту? Банальны

Alexey Veselovsky

unread,
Aug 12, 2010, 6:00:13 AM8/12/10
to erlang-...@googlegroups.com
объекту? Банальный вызов процедур. Блокирующий. И никаких объектов --
обычные структуры/записи.

А вот в ерланге как раз то самое, классическое. Правильное.

Sergey Yelin

unread,
Aug 12, 2010, 6:04:50 AM8/12/10
to erlang-...@googlegroups.com
Это уже было, надо где-то ЧаВо делать. :)

По существу, http://gaperton.livejournal.com/6392.html


12 августа 2010 г. 14:00 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:
объекту? Банальный вызов процедур. Блокирующий. И никаких объектов --
обычные структуры/записи.

А вот в ерланге как раз то самое, классическое. Правильное.

Dmitry Belyaev

unread,
Aug 12, 2010, 6:12:28 AM8/12/10
to erlang-...@googlegroups.com
Я пару дней назад сел на питоне скрипт написать. Как я намучался из-за
того, что в нем нет fold-а. Уже забыл, что такое цикл.

Dmitry Belyaev

Sergey Yelin

unread,
Aug 12, 2010, 6:15:13 AM8/12/10
to erlang-...@googlegroups.com
reduce?
http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29

12 августа 2010 г. 14:12 пользователь Dmitry Belyaev <rumata...@nm.ru> написал:

Maxim Treskin

unread,
Aug 12, 2010, 6:15:21 AM8/12/10
to erlang-...@googlegroups.com

Я пару дней назад сел на питоне скрипт написать. Как я намучался из-за того, что в нем нет fold-а. Уже забыл, что такое цикл.


Там ещё переменные мутабельны. Во мрак-то.

--
Maxim Treskin

Alexey Veselovsky

unread,
Aug 12, 2010, 6:17:36 AM8/12/10
to erlang-...@googlegroups.com
Про GIL забыли :-)

2010/8/12 Maxim Treskin <zert...@gmail.com>:

Eugene Lisitsky

unread,
Aug 12, 2010, 6:24:03 AM8/12/10
to erlang-...@googlegroups.com
Вот GIL - единственный недостаток питона,
мутабельнность переменных - не проблема - не хотите не используйте - никто же насильно не заставляет их менять.
А так в питоне есть инструменты для функционального программирования

12 августа 2010 г. 14:17 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 6:26:39 AM8/12/10
to erlang-...@googlegroups.com
А ещё, а ещё у питона синтаксис странный и не читабельный!

Maxim Treskin

unread,
Aug 12, 2010, 6:28:36 AM8/12/10
to erlang-...@googlegroups.com
А єщо Пітон єст дєтєй!

2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>
А ещё, а ещё у питона синтаксис странный и не читабельный!

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Maxim Treskin

Alexey Veselovsky

unread,
Aug 12, 2010, 6:29:58 AM8/12/10
to erlang-...@googlegroups.com
> Вот GIL - единственный недостаток питона,
> мутабельнность переменных - не проблема - не хотите не используйте - никто же насильно
> не заставляет их менять.

Только вот нет нигде гарантии что в коде коллеги что-то не поменяют
мутабельно. Наличие мутабельности в языке сильно снижает число
инвариантов, усложняет анализ и отладку кода.

Тем более, что мутабельность в питоне никак не ограничена, даже на
уровне типизации. Да и типизация там... Динамическая. Сочетание всего
этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.

Eugene Lisitsky

unread,
Aug 12, 2010, 6:33:51 AM8/12/10
to erlang-...@googlegroups.com
Вот это наиболее серьезная претензия к питону.

А синтиксис у него, на мой взгляд, самый лучший их всех ЯП.
На нем просто нельзя написать нечитаемо.
Очень удобно работать со строками кода - это маленький камешек в огород Эрланга, где используется три разных терминатора строк. То есть не всегда можно просто закомментировать строку, придется менять запятые/точки с зпт/точки.



12 августа 2010 г. 14:28 пользователь Maxim Treskin <zert...@gmail.com> написал:



--
Yours,
Eugene Lisitsky

Eugene Lisitsky

unread,
Aug 12, 2010, 6:36:08 AM8/12/10
to erlang-...@googlegroups.com
Только вот нет нигде гарантии что в коде коллеги что-то не поменяют
мутабельно. Наличие мутабельности в языке сильно снижает число
инвариантов, усложняет анализ и отладку кода.
Если коллеги в коде что-то там меняют, то они могут и операторов вам понаписать и все поломать.
Эта проблема скорее организационная.
 

Тем более, что мутабельность в питоне никак не ограничена, даже на
уровне типизации. Да и типизация там... Динамическая. Сочетание всего
этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.

В Эрланге тоже динамическая типизация - но это никому не мешает.
В переменную можно записать что угодно, но только 1 раз.
Потоки процессы есть, если есть какой-то потенциально опасный участок кода, то оберните его в try...catch.

 
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Михаил Хоменков

unread,
Aug 12, 2010, 6:34:05 AM8/12/10
to erlang-...@googlegroups.com
[ashim@localhost erlres]$ cat object_base.erl
-module(object_base).

-export([method1/0, method2/0]).

method1() -> io:format("method 1 from base object ~n",[]).

method2() -> io:format("method 2 from base object ~n",[]).

[ashim@localhost erlres]$ cat object_ext.erl
-module(object_ext).

-extends(object_base).
-export([method1/0]).

method1() ->
    io:format("method 1 from ext object ~n",[]),
    ?BASE_MODULE:method1().



[ashim@localhost erlres]$ erl
Erlang (BEAM) emulator version 5.6.5 [source] [smp:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.6.5  (abort with ^G)
1> c(object_base).
{ok,object_base}
2> c(object_ext).
{ok,object_ext}
3> object_base:method1().
method 1 from base object
ok
4> object_ext:method1().
method 1 from ext object
method 1 from base object
ok
5> object_base:method2().
method 2 from base object
ok
6> object_ext:method2().
method 2 from base object
ok
7>

12 августа 2010 г. 14:29 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:

Mikhail Gusarov

unread,
Aug 12, 2010, 6:31:30 AM8/12/10
to erlang-...@googlegroups.com

Twas brillig at 14:29:58 12.08.2010 UTC+04 when
alexey.v...@gmail.com did gyre and gimble:

AV> Тем более, что мутабельность в питоне никак не ограничена, даже на
AV> уровне типизации. Да и типизация там... Динамическая. Сочетание
AV> всего этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.

Guns don't kill people, people kill people. На питоне решают другие
задачи и другими способами.

--
http://fossarchy.blogspot.com/

Dmitry Belyaev

unread,
Aug 12, 2010, 6:39:36 AM8/12/10
to erlang-...@googlegroups.com
Вот, в питоне можно такого наворотить, что потом концов не найдешь. Остается лишь организационно все решать. А нужно, чтобы даже без бумажки и угрозы штрафа ничего непозволенного сделать было нельзя.


Dmitry Belyaev

Alexey Veselovsky

unread,
Aug 12, 2010, 6:45:50 AM8/12/10
to erlang-...@googlegroups.com
> Вот это наиболее серьезная претензия к питону.
> А синтиксис у него, на мой взгляд, самый лучший их всех ЯП.
> На нем просто нельзя написать нечитаемо.
Да легко! Достаточно применить регэкспы :-)
Лямбды тоже доставляют.

Также не то что не читабельность, а непонимабельность легко
достигается посредством мутабельности + динамической типизацией.
Массовым повторным использованием одной и той же переменной с разными
типами. Да хоть бы и в цикле -- одна и та же переменная, на каждой
итерации может легко менять свой тип, а не только значение. А то и по
нескольку раз за итерацию. Крута? Читабельность она нужна лишь в том
случае, если она способствует понимабельности. А тут она ей никак не
помогает и не способствует.

Ядрышко то гнилое.

> Очень удобно работать со строками кода - это маленький камешек в огород
> Эрланга, где используется три разных терминатора строк. То есть не всегда
> можно просто закомментировать строку, придется менять запятые/точки с
> зпт/точки.

Это да.

demmonoid

unread,
Aug 12, 2010, 6:45:59 AM8/12/10
to Erlang в России
> > Тем более, что мутабельность в питоне никак не ограничена, даже
на
> > уровне типизации. Да и типизация там... Динамическая. Сочетание всего
> > этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.
>
> > В Эрланге тоже динамическая типизация - но это никому не мешает.
>
> В переменную можно записать что угодно, но только 1 раз.
> Потоки процессы есть, если есть какой-то потенциально опасный участок кода,
> то оберните его в try...catch.

Прелесть эрланга как раз в том, что часто большую часть кода можно
вообще ни во что не оборачивать и программировать в стиле "Let it
fail".

Eugene Lisitsky

unread,
Aug 12, 2010, 6:46:03 AM8/12/10
to erlang-...@googlegroups.com
В любом языке можно сделать кривой модуль,
даже в 1С :)

12 августа 2010 г. 14:39 пользователь Dmitry Belyaev <rumata...@nm.ru> написал:



--
Yours,
Eugene Lisitsky

Mikhail Gusarov

unread,
Aug 12, 2010, 6:52:03 AM8/12/10
to erlang-...@googlegroups.com

Twas brillig at 14:39:36 12.08.2010 UTC+04 when rumata...@nm.ru did gyre and gimble:

DB> Вот, в питоне можно такого наворотить, что потом концов не
DB> найдешь. Остается лишь организационно все решать. А нужно, чтобы
DB> даже без бумажки и угрозы штрафа ничего непозволенного сделать было
DB> нельзя.

А программистов приковывать цепями и держать на баланде, насыщенной
витаминами, чтобы мозг как-то работал. Можно ещё обязать для checkin'а
получать квитанцию с подписью PM-а и заверять её у двух инженеров по
интеграции.

--
http://fossarchy.blogspot.com/

Alexey Veselovsky

unread,
Aug 12, 2010, 6:52:06 AM8/12/10
to erlang-...@googlegroups.com
>> Только вот нет нигде гарантии что в коде коллеги что-то не поменяют
>> мутабельно. Наличие мутабельности в языке сильно снижает число
>> инвариантов, усложняет анализ и отладку кода.
> Если коллеги в коде что-то там меняют, то они могут и операторов вам
> понаписать и все поломать.
> Эта проблема скорее организационная.

В ерланге? Операторов? Как??

>> Тем более, что мутабельность в питоне никак не ограничена, даже на
>> уровне типизации. Да и типизация там... Динамическая. Сочетание всего
>> этого (+ малопоточность, т.е. никакого let it fail) даёт АДЪ.
> В Эрланге тоже динамическая типизация - но это никому не мешает.

Мешает. Но существенно меньше т.к.:
1) Нет мутабельности.
2) otp с супервизорами и прочим let it fail'ом.
3) есть typer & dializer
4) Язык НАМНОГО проще.

> В переменную можно записать что угодно, но только 1 раз.
> Потоки процессы есть, если есть какой-то потенциально опасный участок кода,
> то оберните его в try...catch.

Или дайте же ему наконец упасть!

Mikhail Gusarov

unread,
Aug 12, 2010, 6:54:11 AM8/12/10
to erlang-...@googlegroups.com

Twas brillig at 14:52:06 12.08.2010 UTC+04 when alexey.v...@gmail.com did gyre and gimble:

[..]

zealots are so zealots.

--
http://fossarchy.blogspot.com/

Roman

unread,
Aug 12, 2010, 6:56:05 AM8/12/10
to Erlang в России
Ага в свете всего выше написанного становится немного понятно,
спасибо.

On Aug 12, 1:49 pm, Valentin Nechayev <net...@gmail.com> wrote:
> 2010/8/12 Roman <felix...@gmail.com>:

Alexey Veselovsky

unread,
Aug 12, 2010, 6:57:02 AM8/12/10
to erlang-...@googlegroups.com
> zealots are so zealots.
Однако вы даже не подозреваете zealot'ом чего я являюсь :-)

Eugene Lisitsky

unread,
Aug 12, 2010, 6:59:45 AM8/12/10
to erlang-...@googlegroups.com


12 августа 2010 г. 14:52 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:

>> Только вот нет нигде гарантии что в коде коллеги что-то не поменяют
>> мутабельно. Наличие мутабельности в языке сильно снижает число
>> инвариантов, усложняет анализ и отладку кода.
> Если коллеги в коде что-то там меняют, то они могут и операторов вам
> понаписать и все поломать.
> Эта проблема скорее организационная.

В ерланге? Операторов? Как??
Да тупо написав неверный модуль, который вернет хрен знает что.
Если нет нормального котнроля кода, то возможно что угодно.

 


Или дайте же ему наконец упасть!

Ничего не выйтет! :)
Будем подпирать костылями, пока вся система не помрет.! :) 

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Dmitry Belyaev

unread,
Aug 12, 2010, 7:23:38 AM8/12/10
to erlang-...@googlegroups.com
Да, статическая типизация в эрланге - это было бы круто.
Dmitry Belyaev

Alexey Veselovsky

unread,
Aug 12, 2010, 7:25:44 AM8/12/10
to erlang-...@googlegroups.com
> Да, статическая типизация в эрланге - это было бы круто.
Но профита с т.з. производительности небыло бы никакого, ибо таков beam.

Eugene Lisitsky

unread,
Aug 12, 2010, 7:27:44 AM8/12/10
to erlang-...@googlegroups.com
Но профит с т.з. разработки.

12 августа 2010 г. 15:25 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:
> Да, статическая типизация в эрланге - это было бы круто.
Но профита с т.з. производительности небыло бы никакого, ибо таков beam.

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Dmitry Belyaev

unread,
Aug 12, 2010, 7:30:16 AM8/12/10
to erlang-...@googlegroups.com
Она не для перформанса нужна, а для проверки кода.
Да, есть Dialyzer, но он пошел не в ту сторону, как мне кажется. Спеки
для них ничего не значат, типы новые не объявить (как newtype в
haskell), рекурсивные типы тоже.

Dmitry Belyaev

Фролов Дмитрий

unread,
Aug 12, 2010, 7:37:24 AM8/12/10
to erlang-...@googlegroups.com
пользуйте гуарды для придания мнимой статической типизации, если очень надо )

12 августа 2010 г. 15:30 пользователь Dmitry Belyaev <rumata...@nm.ru> написал:

Dmitry Belyaev

unread,
Aug 12, 2010, 7:40:14 AM8/12/10
to erlang-...@googlegroups.com
Во-первых, гварды влияют на перформанс.
Во-вторых, гвардами невозможно проверить рекурсивный тип.
В-третьих, как без специального инструмента отличить обычную строку от заэскейпленной для БД? Но так, чтобы в рантайме это был один и тот же тип.
Dmitry Belyaev

Фролов Дмитрий

unread,
Aug 12, 2010, 7:44:13 AM8/12/10
to erlang-...@googlegroups.com
вот еще полезная штука
http://www.erlang.org/eeps/eep-0008.html

12 августа 2010 г. 15:40 пользователь Dmitry Belyaev <rumata...@nm.ru> написал:

Max Lapshin

unread,
Aug 12, 2010, 7:52:07 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Eugene Lisitsky <lisi...@gmail.com>:

> А так в питоне есть инструменты для функционального программирования

Ага. Особенно возможность делать многострочные лямбда функции.
Впрочем, после отжига Гвидо стало ясно, что он вообще не вкурсе, что
такое анонимные функции и лямбда-счисление.

Eugene Lisitsky

unread,
Aug 12, 2010, 7:54:11 AM8/12/10
to erlang-...@googlegroups.com
Что там Гвидо отжег? Пришли ссылочку.
Вообще меня очень расстраивают разговоры про удаление функционального программирования из 3-го питона.


12 августа 2010 г. 15:52 пользователь Max Lapshin <max.l...@gmail.com> написал:

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 7:55:23 AM8/12/10
to erlang-...@googlegroups.com
> Впрочем, после отжига Гвидо стало ясно, что он вообще не вкурсе, что
> такое анонимные функции и лямбда-счисление.

Гвидо -- ещё одна проблема питона на букву G? ;-)
А что за отжиг то?

Max Lapshin

unread,
Aug 12, 2010, 7:55:36 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Eugene Lisitsky <lisi...@gmail.com>:

> Что там Гвидо отжег? Пришли ссылочку.
> Вообще меня очень расстраивают разговоры про удаление функционального
> программирования из 3-го питона.
>

Поищи. Он где-то ляпнул, что в питоне fold делается быстро, в десяток
строк кода, «не то что в этих ваших функциональных языках». Короче, он
просто не понимает, зачем нужны многострочные лямбды.

Eugene Lisitsky

unread,
Aug 12, 2010, 7:57:57 AM8/12/10
to erlang-...@googlegroups.com
Дык может они действительно не сильно нужны :)
Сделать нормальными именоваными функциями.

12 августа 2010 г. 15:55 пользователь Max Lapshin <max.l...@gmail.com> написал:

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 8:00:07 AM8/12/10
to erlang-...@googlegroups.com
Дык это ж 2005 год. Тогда питон3 ещё назывался питоном3000. Т.е. это
как бэ уже не актуально. Или я ошибаюсь?

2010/8/12 Max Lapshin <max.l...@gmail.com>:

Dmitry Belyaev

unread,
Aug 12, 2010, 8:02:19 AM8/12/10
to erlang-...@googlegroups.com
Этот EEP внесли разработчики dialyzer-а и это уже все реализовано. Это лучше, чем ничего, но все-равно далеко от желаемого.
Я им когда-то предлагал хотя бы проверять спеки на включение выведеного типа и результатом брать ручное описание, но они считают правильным использовать пересечение этих множеств.
С описанием типов они тоже имеют собственное мнение. Вот что мне тогда отвечали:

http://groups.google.com/group/erlang-programming/browse_thread/thread/645624d71af6ac6e#

Dmitry Belyaev

Alexey Veselovsky

unread,
Aug 12, 2010, 8:02:22 AM8/12/10
to erlang-...@googlegroups.com
> Дык может они действительно не сильно нужны :)
> Сделать нормальными именоваными функциями.

Смысл именовать то, что используется ровно один раз ровно в одном
месте и становится понятно только в контексте использования?

Max Lapshin

unread,
Aug 12, 2010, 8:04:30 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Eugene Lisitsky <lisi...@gmail.com>:

> Дык может они действительно не сильно нужны :)
> Сделать нормальными именоваными функциями.

ты понимаешь разницу между замыканием и функцией?

Eugene Lisitsky

unread,
Aug 12, 2010, 8:07:31 AM8/12/10
to erlang-...@googlegroups.com
Название  и комментарий должны говорить о многом.
Понимаете, подход "сейчас тут сделаем что-то очень маленькое и крутое", очень часто ведет к говнокоду в перловом стиле, со  всеми проблемами:
- выясняется, что такой же функционал нужен еще где-то и начинается тиражирование этих функций
- через полгода даже автор забывает что он хотел этим сказать
- новым людям в команде нужно время чтобы в этом разобраться
- редко какой язык позволит такую трехэтажную конструкцию записать удобочитаемо - а значит ухудшается читаемость


12 августа 2010 г. 16:02 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 8:07:34 AM8/12/10
to erlang-...@googlegroups.com
Если я правильно понял, то разговоры о выкидывании ФП из питона3 были
5 лет назад (тогда питон ещё назывался питоном3000). С тех пор вышел
питон 3, разговоры улеглись, и никто ничего не выкинул.

Dmitry Belyaev

unread,
Aug 12, 2010, 8:11:48 AM8/12/10
to erlang-...@googlegroups.com
Ну локальные именованые функции по сути те же замыкания.

Dmitry Belyaev

Eugene Lisitsky

unread,
Aug 12, 2010, 8:13:21 AM8/12/10
to erlang-...@googlegroups.com
Замыкание - частный случай функции.

12 августа 2010 г. 16:04 пользователь Max Lapshin <max.l...@gmail.com> написал:

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Alex Grigorovich

unread,
Aug 12, 2010, 8:13:56 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Max Lapshin <max.l...@gmail.com>:

В питоне функции замыкаются на лексическое окружение:

def make_adder(x):
def adder(y):
return x+y
return adder

>>> add5 = make_adder(5)
>>> add5(2)
7

Eugene Lisitsky

unread,
Aug 12, 2010, 8:17:00 AM8/12/10
to erlang-...@googlegroups.com
Здесь в принципе похожий случай:

construct_filter(L) ->
  Filter = fun (X) -> lists:member(X, L) end,  % by using L in this fun, we construct closure
  Filter.
 
construct_filter(SmallListOfSearchedElements).

Пардон за пример из вики.



12 августа 2010 г. 16:13 пользователь Alex Grigorovich <alex.gri...@gmail.com> написал:
7

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 8:22:16 AM8/12/10
to erlang-...@googlegroups.com
> Название  и комментарий должны говорить о многом.
О, уже и коментарий появился. Т.о. ради строчки на 10 символов мы:
1) заводим функцию и именуем её (мнится мне, что название функции
будет длинее чем содержимое оной, и не будет говорить о сути действа).
2) вытаскиваем её в глобальную область видимости (соответстенно засираем её).
3) пишем туда до кучи коментарий. (который нужно каждый раз при
изменении кода синхронизировать с кодом ручками).

> Понимаете, подход "сейчас тут сделаем что-то очень маленькое и крутое",
> очень часто ведет к говнокоду в перловом стиле, со  всеми проблемами:

Нет. Здесь мы сделаем что-то очень маленькое и очень простое, ради
которого нет смысла заводить ни имени, ни коментария.

> - выясняется, что такой же функционал нужен еще где-то и начинается
> тиражирование этих функций

Во-первых всё что обобщается и тиражируется, обычно уже есть в
стандартной библиотеке вменяемого языка.
Во-вторых иногда тиражирование лучше чем вызов неведомой хрени непонятно откуда.

> - через полгода даже автор забывает что он хотел этим сказать

С фига ли? То что он хотел сказать явно написано вот прям здесь же,
где оно используется. Не нужно прыгать от куска кода к куску кода. Всё
очень удобно.

> - новым людям в команде нужно время чтобы в этом разобраться

Не. Новым людям нужно будет время чтобы хотя бы прочесть код когда
каждая мало-мальски функциональность вынесена в нечто именованное.
Чтение кода становится не линейным. По сути чтение идет в стиле
спагетти. Эдакий goto но не для исполнителя, а для читателя.

> - редко какой язык позволит такую трехэтажную конструкцию записать
> удобочитаемо - а значит ухудшается читаемость

То, что это не позволяет питон, не говорит о том, что это не возможно
в принципе :-)
См. например haskell, там всё очень читабельно в этом плане. Да и в
ерланге проблем особых нет.

Max Lapshin

unread,
Aug 12, 2010, 8:24:14 AM8/12/10
to erlang-...@googlegroups.com
Так вот нет, это не замыкание частный случай функции, а функция — это
такой частный случай замыкания,
которое имеет нулевую область видимости и присвоено какому-то идентификатору.

Alexey Veselovsky

unread,
Aug 12, 2010, 8:47:52 AM8/12/10
to erlang-...@googlegroups.com
http://www.artima.com/weblogs/viewpost.jsp?thread=98196

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 года вновь
не заходило разговоров.

Eugene Lisitsky

unread,
Aug 12, 2010, 8:51:46 AM8/12/10
to erlang-...@googlegroups.com
Макс, а принципиальное отличие есть?

12 августа 2010 г. 16:24 пользователь Max Lapshin <max.l...@gmail.com> написал:
Так вот нет, это не замыкание частный случай функции, а функция -- это

такой частный случай замыкания,
которое имеет нулевую область видимости и присвоено какому-то идентификатору.

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Eugene Lisitsky

unread,
Aug 12, 2010, 8:56:08 AM8/12/10
to erlang-...@googlegroups.com
12 августа 2010 г. 16:22 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:
Окей, в разных языках немного разный подход. :)

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Andrey Popp

unread,
Aug 12, 2010, 9:05:30 AM8/12/10
to erlang-...@googlegroups.com
В Python проблема в том, как замыкаются функции:

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

Valentin Nechayev

unread,
Aug 12, 2010, 9:11:27 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Andrey Popp <8ma...@gmail.com>:

> В Python проблема в том, как замыкаются функции:
>
> funcs = {}
>
> for i in range(10):
>    funcs[i] = lambda i: i
>
> funcs[0]() # 9
> funcs[1]() # 9
> ...

Нет здесь никакой проблемы, но надо понимать, что в момент
формирования замыкания запоминается не значение переменной, а ссылка
на её экземпляр в стеке. Поэтому нельзя порождать напрямую лямбдой,
надо вызвать функцию, у которой переменная будет аргументом, и в ней
уже породить замыкание.
Вообще это свойство всех языков группы (в Перле то же самое).

--
-netch-

Alexey Veselovsky

unread,
Aug 12, 2010, 9:12:57 AM8/12/10
to erlang-...@googlegroups.com
> funcs = {}
>
> for i in range(10):
>    funcs[i] = lambda i: i
>
> funcs[0]() # 9
> funcs[1]() # 9

Вот говорят питон читабельный, а я вот с первого раза ну нифига не
понял что тут происходит. Потом посмотрел немного доку и таки понял.

for i in range(10) # сколь я понял -- плохая практика, ибо range
создаст список. энергично. соответственно отхавают память там, где
хавать не было нужды.

Каким образом получаются


> funcs[0]() # 9
> funcs[1]() # 9

Я вообще не понял. Как там могут быть девятки то?

PS. Вначале долго думал зачем в лямбде i делят на i, потом дошло, что
это синтаксис такой. не очевидный.

Dmitry Belyaev

unread,
Aug 12, 2010, 9:15:15 AM8/12/10
to erlang-...@googlegroups.com
В новом питоне только range и остался, он создает генератор, как раньше
xrange.
Замыкается переменная i, которая мутабельна, поэтому везде получаем
указатели на одну и ту же переменную, принявшую последнее значение.

Dmitry Belyaev

Max Lapshin

unread,
Aug 12, 2010, 9:15:28 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

> Вот говорят питон читабельный, а я вот с первого раза ну нифига не
> понял что тут происходит. Потом посмотрел немного доку и таки понял.

Да не, Лёш, я тоже считаю что код на питоне в среднем читабельнее чем
на многом другом.

net...@gmail.com

unread,
Aug 12, 2010, 9:15:44 AM8/12/10
to Erlang в России
On Aug 12, 4:12 pm, Alexey Veselovsky <alexey.veselov...@gmail.com>
wrote:

> for i in range(10) # сколь я понял -- плохая практика, ибо range
> создаст список. энергично. соответственно отхавают память там, где
> хавать не было нужды.

В третьем питоне range() создаёт итератор.

>
> Каким образом получаются
>
> > funcs[0]() # 9
> > funcs[1]() # 9
>
> Я вообще не понял. Как там могут быть девятки то?

Зацепилась переменная, а не её значение. См. мой предыдущий
комментарий.

> PS. Вначале долго думал зачем в лямбде i делят на i, потом дошло, что
> это синтаксис такой. не очевидный.

Для лямбды - вполне очевидный.

Alexey Veselovsky

unread,
Aug 12, 2010, 9:18:21 AM8/12/10
to erlang-...@googlegroups.com
А, кажется понял. Очередной выкрутас динамической типизации +
выкрутасы мутабельности. Мы создали массив хз. чего. Потом в этот
массив поклали не значения типа int, а таки пачку лямбда-функций. И
почему-то лямбда-функции не потащили за собой индивидуальный контекст
каждой, а радостно потащили за собой общий контекст. Мутабельный
контекст!

Ужоз.

Valentin Nechayev

unread,
Aug 12, 2010, 9:20:28 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

Если уметь с ним работать - никакого ужаса, зато много интересных
возможностей.:)

--
-netch-

Alexey Veselovsky

unread,
Aug 12, 2010, 9:22:26 AM8/12/10
to erlang-...@googlegroups.com
> Нет здесь никакой проблемы, но надо понимать, что в момент
> формирования замыкания запоминается не значение переменной, а ссылка
> на её экземпляр в стеке. Поэтому нельзя порождать напрямую лямбдой,
> надо вызвать функцию, у которой переменная будет аргументом, и в ней
> уже породить замыкание.
> Вообще это свойство всех языков группы (в Перле то же самое).

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

С тем же успехом можно таки да, именованную функцию вызывать.

А то, что у перла есть подобные проблемы -- нифига не оправдание.

Alexander Dergachev

unread,
Aug 12, 2010, 9:22:11 AM8/12/10
to erlang-...@googlegroups.com
не, правда ужас...

2010/8/12 Valentin Nechayev <net...@gmail.com>
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
With Best Regards,
Alexander Dergachev

Eugene Lisitsky

unread,
Aug 12, 2010, 9:23:35 AM8/12/10
to erlang-...@googlegroups.com
...или гибкость

можно передать общий контекст, но если нужно, можно сконструировать свой.

12 августа 2010 г. 17:22 пользователь Alexander Dergachev <cy6er...@gmail.com> написал:



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 9:28:38 AM8/12/10
to erlang-...@googlegroups.com
> Да не, Лёш, я тоже считаю что код на питоне в среднем читабельнее чем
> на многом другом.

Cмотря что подразумевать под многим другим. Если мы смотрим в сторону
перла и Си, то таки да, вполне возможно. Если же в сторону языков с
нормальным синтаксисом, вроде Ады, или Модулы, Оберона, или даже
Haskell'я (у последнего сложность чтения исходников не связана с
синтаксисом), то таки нет. Собственно и у ерланга я не вижу проблем с
читабельностью. И мне лично разбираться в питоноисходниках существенно
сложнее чем в ерланговых. В т.ч. и по синтаксису.

Впрочем, мне сложно рассматривать читабельность в отрыве от
понимабельности кода.

Alexey Veselovsky

unread,
Aug 12, 2010, 9:29:34 AM8/12/10
to erlang-...@googlegroups.com
> В новом питоне только range и остался, он создает генератор, как раньше
> xrange.
> Замыкается переменная i, которая мутабельна, поэтому везде получаем
> указатели на одну и ту же переменную, принявшую последнее значение.

Но в основном используется то 2.6 питон. А то и 2.5

Alexey Veselovsky

unread,
Aug 12, 2010, 9:30:49 AM8/12/10
to erlang-...@googlegroups.com
> ...или гибкость
> можно передать общий контекст, но если нужно, можно сконструировать свой.
Да-да.
"Этот язык не кривой, а гибкий!"

Eugene Lisitsky

unread,
Aug 12, 2010, 9:31:14 AM8/12/10
to erlang-...@googlegroups.com
Мне кажется, это больше вопрос привычки.

12 августа 2010 г. 17:28 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:
--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Max Lapshin

unread,
Aug 12, 2010, 9:31:16 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

>> Да не, Лёш, я тоже считаю что код на питоне в среднем читабельнее чем
>> на многом другом.
>


> Cмотря что подразумевать под многим другим. Если мы смотрим в сторону
> перла и Си, то таки да, вполне возможно.

После прочтения исходников ffmpeg-а C уже не кажется таким монстром,
хотя конечно да.


> Если же в сторону языков с
> нормальным синтаксисом, вроде Ады, или Модулы, Оберона, или даже
> Haskell'я (у последнего сложность чтения исходников не связана с
> синтаксисом), то таки нет.

Давай всё таки говорить о языках, за написание программ на которых
сегодня платят деньги.


> Собственно и у ерланга я не вижу проблем с
> читабельностью. И мне лично разбираться в питоноисходниках существенно
> сложнее чем в ерланговых. В т.ч. и по синтаксису.
>
> Впрочем, мне сложно рассматривать читабельность в отрыве от
> понимабельности кода.

Ну да. erlang очень примитивный синтаксически и семантически язык, чем
и прекрасен.
А так — да, у меня за год работы с видео уже отошел на второй план
вопрос понимаемости кода, потому что какая разница на чём написан
демуксер транспортного потока, если это само по себе очень сложно!

Eugene Lisitsky

unread,
Aug 12, 2010, 9:31:47 AM8/12/10
to erlang-...@googlegroups.com
а в чем проблема сделать копию и передать, если нужно именно это значение?

12 августа 2010 г. 17:30 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru



--
Yours,
Eugene Lisitsky

Alexey Veselovsky

unread,
Aug 12, 2010, 9:32:10 AM8/12/10
to erlang-...@googlegroups.com
> Если уметь с ним работать - никакого ужаса, зато много интересных
> возможностей.:)

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

PS. Да, я плюсист. В основном. ;-)

Alexander Dergachev

unread,
Aug 12, 2010, 9:34:29 AM8/12/10
to erlang-...@googlegroups.com
так там лямбды однострочные, особо и не развернешься с этой вашей "гибкостью" :))

2010/8/12 Eugene Lisitsky <lisi...@gmail.com>



--

Alexey Veselovsky

unread,
Aug 12, 2010, 9:38:28 AM8/12/10
to erlang-...@googlegroups.com
> После прочтения исходников ffmpeg-а C уже не кажется таким монстром,
> хотя конечно да.
Ой, таки не надо про ffmpeg...

>> Если же в сторону языков с
>> нормальным синтаксисом, вроде Ады, или Модулы, Оберона, или даже
>> Haskell'я (у последнего сложность чтения исходников не связана с
>> синтаксисом), то таки нет.
> Давай всё таки говорить о языках, за написание программ на которых
> сегодня платят деньги.

А я про такие и говорю. Их платят. И даже таки прямо в России.
Впрочем, за Аду в россии возможно и не платят. Зато очень хорошо
платят в европе и США.

> Ну да. erlang очень примитивный синтаксически и семантически язык, чем
> и прекрасен.

> А так -- да, у меня за год работы с видео уже отошел на второй план


> вопрос понимаемости кода, потому что какая разница на чём написан
> демуксер транспортного потока, если это само по себе очень сложно!

Ну, недавно в конфе была же тема по этому поводу -- base64. 4ре
реализации на разных языках. Я спрашивал народ какая реализация 1)
читабельней 2) понимабельней. Впрочем, народ вяло отреагировал. Видать
было влом :-)

Alexey Veselovsky

unread,
Aug 12, 2010, 9:39:40 AM8/12/10
to erlang-...@googlegroups.com
> а в чем проблема сделать копию и передать, если нужно именно это значение?
Тем, что это закат слонца в ручную. С тем же успехом писать можно на
Си а не на питоне. Какая разница? Ах, да, синтаксис же! Ну, тогда на
Модуле-2.

Sergey Yelin

unread,
Aug 12, 2010, 9:40:34 AM8/12/10
to erlang-...@googlegroups.com
Хм. Ада сейчас в каких областях используется?

12 августа 2010 г. 17:38 пользователь Alexey Veselovsky <alexey.v...@gmail.com> написал:

Alexey Veselovsky

unread,
Aug 12, 2010, 9:40:51 AM8/12/10
to erlang-...@googlegroups.com
Нет. Это не вопрос привычки. В питонокоде просто намного меньше
инвариантов. Меньше гарантий. Приходится рассматривать больше
вариантов, выдвигать больше гипотиз о поведении кода, и проверять их.

Valentin Nechayev

unread,
Aug 12, 2010, 9:50:15 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

И кто бы говорил. В течение 30 лет пальму первенства самого кошмарного
функционального языка держал m4, но язык плюсовых шаблонов его
победил.
Возможностей прострелить себе все клетки и ткани одним выстрелом -
столько, что никакому Александреску не приснится.
"И эти люди запрещают мне ковырять в носу" (tm)

Стандартый дисклеймер прилагается:)

--
-netch-

Valentin Nechayev

unread,
Aug 12, 2010, 9:51:36 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

http://en.wikipedia.org/wiki/Bikeshed

--
-netch-

Valentin Nechayev

unread,
Aug 12, 2010, 9:54:14 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

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

--
-netch-

Alexey Veselovsky

unread,
Aug 12, 2010, 9:56:31 AM8/12/10
to erlang-...@googlegroups.com
>> Стандартная отмазка перлистов, плюсистов и брейнфаковцев. :-)
>> Например такая интересная возможность, как прострелить себе ногу через
>> левое ухо в самый интересный момент.
>>
>> PS. Да, я плюсист. В основном. ;-)
>
> И кто бы говорил. В течение 30 лет пальму первенства самого кошмарного
> функционального языка держал m4, но язык плюсовых шаблонов его
> победил.
> Возможностей прострелить себе все клетки и ткани одним выстрелом -
> столько, что никакому Александреску не приснится.
> "И эти люди запрещают мне ковырять в носу" (tm)

Ой, а я где-то агитировал за плюсы? Нет, я могу конечно, но только за
отдельную плату.

Valentin Nechayev

unread,
Aug 12, 2010, 10:06:19 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Alexey Veselovsky <alexey.v...@gmail.com>:

> Нифига себе нет проблемы. Предлагается, по сути, вручную копировать
> весь необходимый контекст исполнения. Закат солнца в ручную получается
> однако.

И много его копировать-то? У вас замыкания на полсотни переменных?

> С тем же успехом можно таки да, именованную функцию вызывать.

Именованная функция полезна не потому, что так написал ВЦСПС, а
потому, что у неё есть имя, которое видно в отладочно-диагностических
средствах начиная со снятия бектрейса. Имя, а не странные зюки,
которым в трейсе показываются fun() эрланга и которые, если в функции
более одного fun(), заставляют любого поседеть (особенно когда лишний
fun() сгенерирован компилятором).

> А то, что у перла есть подобные проблемы -- нифига не оправдание.

Эти проблемы у всех. А в эрланге они замаскированы только потому, что
там "переменные" не меняются.

--
-netch-

Alexey Veselovsky

unread,
Aug 12, 2010, 10:21:36 AM8/12/10
to erlang-...@googlegroups.com
>> Нифига себе нет проблемы. Предлагается, по сути, вручную копировать
>> весь необходимый контекст исполнения. Закат солнца в ручную получается
>> однако.
> И много его копировать-то? У вас замыкания на полсотни переменных?
В условиях мутабельности всего и вся, вполне возможно что будет и с
полсотни. Нужно же будет сделать deep copy :-)

>> С тем же успехом можно таки да, именованную функцию вызывать.
> Именованная функция полезна не потому, что так написал ВЦСПС, а
> потому, что у неё есть имя, которое видно в отладочно-диагностических
> средствах начиная со снятия бектрейса. Имя, а не странные зюки,
> которым в трейсе показываются fun() эрланга и которые, если в функции
> более одного fun(), заставляют любого поседеть (особенно когда лишний
> fun() сгенерирован компилятором).

Это проблема отладочных средств, которые ниасиливают выдать номер
строки кода где объявлена функция.

>> А то, что у перла есть подобные проблемы -- нифига не оправдание.
> Эти проблемы у всех. А в эрланге они замаскированы только потому, что
> там "переменные" не меняются.

Это не так. Тот же пример с циклом вполне себе реализуется на ерланге
через хвостовую рекурсию. "переменная" цикла будет вполне себе
меняться от итерации к итерации. Захват контекста будет выполнен
вполне корректно.

Никакой маскировки.

Dmitry Belyaev

unread,
Aug 12, 2010, 10:30:32 AM8/12/10
to erlang-...@googlegroups.com
Правила именования замыканий в эрланге документированы и все довольно
легко находится.

А с переменными здесь не все круто - общая область видимости на всю
функцию иногда мешает (особенно в лесу из case-ов).

Вот были бы модификаторы матчинга для бинда имени к значению или
получения значения по имени.
...
A = calc1(),
A = calc2()

Для того, чтобы понять, что первая строчка - это биндинг, необходимо
делать поиск по коду, а не встречается ли где-то выше такое имя.
Насколько лучше было бы иметь модификатор к имени, который бы сразу
говорил о биндинге значения:
?A = calc1(),
A = calc1()

Dmitry Belyaev

Alexander Dergachev

unread,
Aug 12, 2010, 10:41:20 AM8/12/10
to erlang-...@googlegroups.com
а вот не надо делать переменные с именами A, B, C, и если приходится объявлять новую "переменную" в середине функции, то надо давать ей вменяемое имя, относящееся к контексту ее использования. Никогда не сталкивался с подобными "проблемами"...

2010/8/12 Dmitry Belyaev <rumata...@nm.ru>
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Jabber-конференция: erl...@conference.jabber.ru
Новости: http://erlanger.ru



--

Dmitry Belyaev

unread,
Aug 12, 2010, 10:45:50 AM8/12/10
to erlang-...@googlegroups.com
Ну да, особенно с неизменяемыми состояниями.
State, State0, NewState...

Частенько, знаете ли, приходится модифицировать состояние мелкими функциями, короткое и емкое имя выдумывать нет времени, длинное быстро, но непрактично.

Dmitry Belyaev

Alexander Dergachev

unread,
Aug 12, 2010, 11:06:52 AM8/12/10
to erlang-...@googlegroups.com
почему не практично? практичнее потом по бэктрейсам разбираться почему оно вам говорит что левое на правое не сматчилось?

2010/8/12 Dmitry Belyaev <rumata...@nm.ru>

Valentin Nechayev

unread,
Aug 12, 2010, 11:07:58 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Dmitry Belyaev <rumata...@nm.ru>:

> Ну да, особенно с неизменяемыми состояниями.
> State, State0, NewState...
>
> Частенько, знаете ли, приходится модифицировать состояние мелкими функциями,
> короткое и емкое имя выдумывать нет времени, длинное быстро, но непрактично.

+100.
А ещё хорошо бы иметь аналог f() для кода. Пусть даже только на
линейных участках, всё равно хлеб.


-netch-

Valentin Nechayev

unread,
Aug 12, 2010, 11:11:11 AM8/12/10
to erlang-...@googlegroups.com
2010/8/12 Dmitry Belyaev <rumata...@nm.ru>:

> Правила именования замыканий в эрланге документированы и все довольно легко
> находится.

Нет, если оказывается, что компилятор переделал lists:map() в
comprehension или аналогичное преобразование - то функция куда-то
исчезает, то появляется.

> Для того, чтобы понять, что первая строчка - это биндинг, необходимо делать
> поиск по коду, а не встречается ли где-то выше такое имя. Насколько лучше
> было бы иметь модификатор к имени, который бы сразу говорил о биндинге
> значения:
> ?A = calc1(),
> A = calc1()

Ну я во втором случае бы явно писал комментарий про проверку с вылетом.
Не основное средство, но помогает читать.

--
-netch-

Dmitry Belyaev

unread,
Aug 12, 2010, 11:34:50 AM8/12/10
to erlang-...@googlegroups.com
Что за f()?

Dmitry Belyaev

It is loading more messages.
0 new messages