vendredi, août 31, 2007

Difficultés en Erlang

J’ai travaillé pas mal avec Erlang durant la dernière semaine. La familiarisation avec le paradigme fonctionnel n’a pas été trop difficile. Concevoir des fonctions tail-recursive demande un peu de planification mais ce n’est pas très difficile non plus.
La grande difficulté que j’ai eu réside dans la conversion de fonction qui bâtissent des listes « linéairement » en fonction qui les bâtissent en parallèle pour le cas où l’ordre des éléments de la liste ne compte pas vraiment.
Par exemple, la fonction :

calculateitems ([H | T], N) ->
[onestock(H, N) | calculateitems(T, N)];
calculateitems([], N) ->
[].

Retourne un message d’erreur “badarith” lorsqu’exprimé comme ça :

calculateitems(L, N) –>
S = self,
Pids = lists:map( fun(X) -> spawn(portfolio, onestock/2, [X, N]) end, L),
gather(Pids).
gather([H | T]) ->
Receive
{H, Ret} -> [Ret | gather(T)]
end;
gather([]) ->
[].

Pourtant la fonction onestock ne comporte aucun changement d’une forme à l’autre. Remplaçant spawn par proc_lib:spawn nous donne plus d’information mais le mystère demeure :
** exited: {badarith,[{portfolio,'-calculateitemsp/2-fun-0-',2},
{portfolio,calculateitemsp,2},
{portfolio,calculate,2},
{lists,map,2},
{portfolio,simulate,3},
{erl_eval,do_apply,5},
{shell,exprs,6},
{shell,eval_loop,3}]} **

=ERROR REPORT==== 30-Aug-2007::12:49:52 ===
Error in process <0.57.0> with exit value: {badarith,[{portfolio,'-calculateitemsp/2-fun-0-',2},{portfolio,calculateitemsp,2},{portfolio,calculate,2},{lists,map,2},{portfolio,simulate,3},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}

La documentation disponible sur le ‘net est au mieux faible. Est-ce que quelqu’un aurait une solution à mon problème?

Aucun commentaire: