Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Функциональные языки: общие вопросы > Erlang упражнение из книги Армистрона


Автор: Valinur 6.5.2012, 22:24
Привет всем! Начал изучать Эрланг, и вот дошел уже до первой более меняя вменяемой задачи для самостоятельного решения. Вторая задача в конце 8 главы.

Цитирую
Напишите кольцевой тест. Создайте N процессов в кольце. Отправьте
сообщение по кольцу M раз так, чтобы было отправлено N * M сообщений.

И вот что у меня получилось
Код

-module(chain).
-export([start/2]).


start(N, M) ->
    Chain_List = create_chain(N, fun chain_process/0),
    [Pid_first | _Chain] = Chain_List,
    Pid_first ! {send_message, Chain_List, M},
    ok.

chain_process() ->
    receive
        {send_message, Chain_List, M} ->
            [_Pid_self, Pid_next | Chain] = Chain_List,
            Pid_next ! {send_message, Chain_List, Chain, M},
            io:format("sent message from ~p to ~p~n", [self(), Pid_next]);
        {send_message, Chain_List, [Pid | Chain], 0} ->
            void;
        {send_message, Chain_List, [Pid | Chain], M} ->
            Pid ! {send_message, Chain_List, Chain, M},
            io:format("sent message from ~p to ~p~n", [self(), Pid]);
        {send_message, Chain_List, [], M} ->
            [Pid_first | Chain] = Chain_List,
            Pid_first ! {send_message, Chain_List, Chain, M - 1},
            io:format("sent message from ~p to ~p~n", [self(), Pid_first]);
        Other ->
            io:format("get other ~p~n", [Other])
    end,
    chain_process().

create_chain(0, _Fun, Chain_List) ->
    Chain_List;
create_chain(N, Fun, Chain_List) ->
    Pid = spawn(Fun),
    create_chain(N-1, Fun, [Pid | Chain_List]).

create_chain(N, Fun) ->
    create_chain(N, Fun, []).



Пример работает. И даже вроде как надо smile
Подскажите пожалуйста, где я допустил грубые ошибки? Как можно было бы сделать лучше? Я уверен, у меня не идеальный вариант

Автор: Valinur 7.7.2012, 03:00
UP! Неужели никто? =(

Автор: Бонифаций 11.7.2012, 09:09
ну давайте попробуем. Я бы создание кольца поручил самим процессам. Что то  типа:

Код

start(N,M) ->
    HeadPid = spawn(fun() -> chain_proc(1,N) end),
    HeadPid ! N*M.

chain_proc(C,N) -> chain_proc_create(C,N,self()).

chain_proc_create(N,N,HeadLink) -> react(N,HeadLink);
chain_proc_create(C,N,HeadLink) -> react(C,spawn(fun() -> chain_proc_create(C+1,N,HeadLink) end)).

react(ProcNum, NextHop) -> 
    receive
    0 -> ok;
    N -> io:format("Proc ~p received ~p ~n",[ProcNum, N]), NextHop ! N-1         
    end,
    react(ProcNum,NextHop).



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)