Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Erlang упражнение из книги Армистрона 
:(
    Опции темы
Valinur
Дата 6.5.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

Репутация: нет
Всего: 6



Привет всем! Начал изучать Эрланг, и вот дошел уже до первой более меняя вменяемой задачи для самостоятельного решения. Вторая задача в конце 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
Подскажите пожалуйста, где я допустил грубые ошибки? Как можно было бы сделать лучше? Я уверен, у меня не идеальный вариант
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Valinur
Дата 7.7.2012, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 21.9.2007
Где: Москва

Репутация: нет
Всего: 6



UP! Неужели никто? =(
--------------------
Не бойтесь совершенства, Вы все равно его не достигнете (с) ...
PM MAIL   Вверх
Бонифаций
Дата 11.7.2012, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: нет
Всего: 40



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

Код

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).





--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1159 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.