Erlang упражнение из книги Армистрона

 
0
 
Functional languages
ava
Valinur | 06.05.2012, 23: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
Подскажите пожалуйста, где я допустил грубые ошибки? Как можно было бы сделать лучше? Я уверен, у меня не идеальный вариант
Comments (3)
ava
Valinur | 07.07.2012, 03:00 #
UP! Неужели никто? =(
ava
Бонифаций | 11.07.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).


ava
dmitryttt | 30.04.2013, 14:57 #
Я делал так эту задачу (тоже изучаю) :

https://bitbucket.org/dtyuterev/erlang_lear....erl?at=default
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit