héhé mais là vous êtes trois à parler, tu sers d'entremetteur !
Voici un petit exemple de code pour dialoguer avec un character
la fonction test ne compte pas, c'est juste pour s'éviter de taper dans le shell quand on debug.
On peut voir un truc courant en erlang, la partie client et la partie serveur son codées dans le même module
On encapsule donc tout ce qui concerne le processus, premièrement le 'spawn', ensuite l'envoi de messages, et enfin la réception des messages.
ça permet d'avoir un comportement asynchrone mais en gardant une API qui ressemble à du code classique, synchrone.
Enfin, ça nique un peu la lisibilité du code, mais io_lib:format/2 renvoie des listes imbriquées, la fonction lists:flatten/1 prend une liste et l'applatit comme son nom l'indique
Voici un petit exemple de code pour dialoguer avec un character
Code :
- module(character).
- export([ start/1, talk_to/2,character/1,test/0 ]).
start(Name) ->spawn(character, character, [Name]).
talk_to(CharacterPID, Msg) ->
CharacterPID ! {self(), Msg},
receive
{reply, Reply} -> lists:flatten(Reply)
after 5000 -> noreply
end.
character(Name) ->
receive
{ Sender, introduce } ->
Reply = io_lib:format("Hello ~p, I'm ~s.", [Sender,Name]),
Sender ! {reply, Reply},
character(Name);
{ Sender, stop } ->
Reply = io_lib:format("Bye.",[]),
Sender ! {reply, Reply};
{ Sender, Msg } ->
Reply = io_lib:format("You said ~s.", [Msg]),
Sender ! {reply, Reply},
character(Name)
end.
test() ->
Pid = spawn(character, character, ["BBOy"]),
talk_to(Pid, introduce).
Code :
54> c(character).
{ok,character}
55> P = character:start("Sephi").
<0.174.0>
56> character:talk_to(P, introduce).
"Hello <0.166.0>, I'm Sephi."
57> character:talk_to(P, "bla bla bla").
"You said bla bla bla."
58> character:talk_to(P, stop).
"Bye."
59> character:talk_to(P, stop).
noreply
la fonction test ne compte pas, c'est juste pour s'éviter de taper dans le shell quand on debug.
On peut voir un truc courant en erlang, la partie client et la partie serveur son codées dans le même module
On encapsule donc tout ce qui concerne le processus, premièrement le 'spawn', ensuite l'envoi de messages, et enfin la réception des messages.
ça permet d'avoir un comportement asynchrone mais en gardant une API qui ressemble à du code classique, synchrone.
Enfin, ça nique un peu la lisibilité du code, mais io_lib:format/2 renvoie des listes imbriquées, la fonction lists:flatten/1 prend une liste et l'applatit comme son nom l'indique
Code :
62> lists:flatten([1,2,[[4,5],6,7,[8,[9]]]]).
[1,2,4,5,6,7,8,9]