[Erlang] попинайте решение задачки о N processes in a star
От: C0x  
Дата: 08.10.08 12:29
Оценка:
Экспереминтирую с Erlang, попинайте пожалуйста решение следующей задачи (взята с сайта erlang.org). Поскольку в Эрланге я полный нуб, то меня больше интересует не сама корректность решения задачи, а больше хочу понять как вобще подходить к проектированию решений на Эрланг


3) Write a function which starts N processes in a star, and sends a message to each of them M times. After the messages have been sent the processes should terminate gracefully.


А вот мое решение


-module(star_proc).
-export([start/2, worker_loop/0, do_msg_exchange/1]).

start(N, M) -> 
    Pids = for(1, N, fun(_) -> spawn(star_proc, worker_loop, []) end),
    for(1, M, fun(_) -> lists:foreach(fun(Pid) -> do_msg_exchange(Pid) end, Pids) end),
    lists:foreach(fun(Pid) -> Pid ! stop end, Pids).

do_msg_exchange(Pid) ->
    io:format("take ~w~n",[Pid]),
    Pid ! {self(), take},
    receive 
        takeback -> Pid 
    end.
    
worker_loop() ->
    receive
        {From, take} -> 
            io:format("took~n"),
            From ! takeback,
            worker_loop();
        stop -> 
            io:format("deadman~n")
    end.

for(N, N, F) when N > 0 ->
    [F(N)];
for(B, E, F) when B > 0, E > 0 ->
    [F(B)|for(B+1, E, F)].
Re: [Erlang] попинайте решение задачки о N processes in a st
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.10.08 12:38
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Экспереминтирую с Erlang, попинайте пожалуйста решение следующей задачи (взята с сайта erlang.org). Поскольку в Эрланге я полный нуб, то меня больше интересует не сама корректность решения задачи, а больше хочу понять как вобще подходить к проектированию решений на Эрланг


[cut]

С ходу вроде бы замечаний нет, только вот for/3 я бы реализовал через lists:foreach/2 +lists:seq/2
Ну и проектирование решений в Эрланге на таких маленьких задачах особо не демонстрируется, тут надо смотреть в сторону OTP (к примеру, читать принципы дизайна, скажем наш перевод)
Re: [Erlang] попинайте решение задачки о N processes in a st
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.10.08 12:40
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Экспереминтирую с Erlang, попинайте пожалуйста решение следующей задачи (взята с сайта erlang.org). Поскольку в Эрланге я полный нуб, то меня больше интересует не сама корректность решения задачи, а больше хочу понять как вобще подходить к проектированию решений на Эрланг


+ Ещё одно замечание: имхо это моветон, когда код 2 разных процессов в одном модуле содержится.
Re[2]: [Erlang] попинайте решение задачки о N processes in a
От: C0x  
Дата: 08.10.08 13:08
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, C0x, Вы писали:


C0x>>Экспереминтирую с Erlang, попинайте пожалуйста решение следующей задачи (взята с сайта erlang.org). Поскольку в Эрланге я полный нуб, то меня больше интересует не сама корректность решения задачи, а больше хочу понять как вобще подходить к проектированию решений на Эрланг


К>[cut]


К>С ходу вроде бы замечаний нет, только вот for/3 я бы реализовал через lists:foreach/2 +lists:seq/2



А как можно заменить через lists:foreach/2 +lists:seq/2 следущую строчку?

Pids = for(1, N, fun(_) -> spawn(star_proc, worker_loop, []) end)


Там ведь нужно вернуть список Pids, а foreach ничего не возвращает.

Вот эту строчку заменил без проблем:

for(1, M, fun(_) -> lists:foreach(fun(Pid) -> do_msg_exchange(Pid) end, Pids) end)


на

lists:foreach(fun(_) -> lists:foreach(fun(Pid) -> do_msg_exchange(Pid) end, Pids) end, lists:seq(1, 10))


Стало лучше

К>Ну и проектирование решений в Эрланге на таких маленьких задачах особо не демонстрируется, тут надо смотреть в сторону OTP (к примеру, читать принципы дизайна, скажем наш перевод)


Я еще пока до туда не дошел, хочу просто вникнуть в суть функционального программирования, потом возьмусь за большие задачи
Re[2]: [Erlang] попинайте решение задачки о N processes in a
От: Аноним  
Дата: 08.10.08 13:13
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, C0x, Вы писали:


C0x>>Экспереминтирую с Erlang, попинайте пожалуйста решение следующей задачи (взята с сайта erlang.org). Поскольку в Эрланге я полный нуб, то меня больше интересует не сама корректность решения задачи, а больше хочу понять как вобще подходить к проектированию решений на Эрланг


К>+ Ещё одно замечание: имхо это моветон, когда код 2 разных процессов в одном модуле содержится.


А если процессы очень маленькие и относятся к решению одной конкретной задачи?
Re[3]: [Erlang] попинайте решение задачки о N processes in a
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.10.08 13:15
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Здравствуйте, Курилка, Вы писали:


К>>С ходу вроде бы замечаний нет, только вот for/3 я бы реализовал через lists:foreach/2 +lists:seq/2


C0x>А как можно заменить через lists:foreach/2 +lists:seq/2 следущую строчку?


C0x>
C0x>Pids = for(1, N, fun(_) -> spawn(star_proc, worker_loop, []) end)
C0x>


Извиняюсь, это просмотрел, для этого есть lists:map/2
Ну и в принципе по-моему дурной тон когда 2 разных use case для одной и той же функции (в данном случае используются возвращаемые значения или нет, хотя компилятор соптимизирует вариант с "отбрасываемым" списком).

К>>Ну и проектирование решений в Эрланге на таких маленьких задачах особо не демонстрируется, тут надо смотреть в сторону OTP (к примеру, читать принципы дизайна, скажем наш перевод)


C0x>Я еще пока до туда не дошел, хочу просто вникнуть в суть функционального программирования, потом возьмусь за большие задачи
Re[3]: [Erlang] попинайте решение задачки о N processes in a
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.10.08 13:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Курилка, Вы писали:


К>>Здравствуйте, C0x, Вы писали:


C0x>>>Экспереминтирую с Erlang, попинайте пожалуйста решение следующей задачи (взята с сайта erlang.org). Поскольку в Эрланге я полный нуб, то меня больше интересует не сама корректность решения задачи, а больше хочу понять как вобще подходить к проектированию решений на Эрланг


К>>+ Ещё одно замечание: имхо это моветон, когда код 2 разных процессов в одном модуле содержится.


А>А если процессы очень маленькие и относятся к решению одной конкретной задачи?


Ну дак говорю, что это лишь моветон, если очень хочется, то можно
Просто если будет нормальное приложение, то процессы скорее всего будут не столь элементарны (будут какие-нибудь gen_server, например), поэтому лучше разносить по разным модулям, дабы связность лишнюю не создавать (т.е. поддерживать модульность кода).
Re[2]: [Erlang] попинайте решение задачки о N processes in a
От: Трурль  
Дата: 10.10.08 07:47
Оценка:
Здравствуйте, Курилка, Вы писали:

К>С ходу вроде бы замечаний нет, только вот for/3 я бы реализовал через lists:foreach/2 +lists:seq/2

А зачем? А если M=10000?
Re[3]: [Erlang] попинайте решение задачки о N processes in a
От: Курилка Россия http://kirya.narod.ru/
Дата: 10.10.08 08:02
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>Здравствуйте, Курилка, Вы писали:


К>>С ходу вроде бы замечаний нет, только вот for/3 я бы реализовал через lists:foreach/2 +lists:seq/2

Т>А зачем? А если M=10000?
Даже и 100000 погоды не сделает.
Небольшой оверхэд на список, безусловно будет, но самописный нетестированный for/3, заменяем на отработанные библиотечные функции с чёткой семантикой.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.