Есть несколько изменений, которые вы могли бы сделать, чтобы сделать код более понятным, и, надеюсь, это облегчит поиск проблемы. Обычно вы используете функцию element
очень редко, предпочитая вместо этого сопоставление с шаблоном. Так что измени это:
A=file:consult("calls.txt"),
T=element(2,A),
до:
{ok, T} = file:consult("calls.txt"),
Это имеет то преимущество, что если file:consult
возвращает ошибку, код быстро ее поймает, вместо того, чтобы пытаться продолжить работу, даже если у него нет данных из файла.
Ходить по списку и делать что-то для каждого элемента - обычная картина в Эрланге. Вместо того, чтобы хранить индекс и использовать lists:nth
, вы обычно вызываете lists:foreach
, который является функцией более высокого уровня, которая вызывает вашу функцию для каждого элемента списка. Так что вместо:
L=length(T),
%io:fwrite("~w",[L]),
for(L,T).
Вы можете написать:
lists:foreach(fun for/1, T).
Тогда ваша for
функция (которая, возможно, получит другое имя, так как она больше не выполняет цикл) будет начинаться с:
for(S) ->
S1=element(1,S),
io:fwrite(" ~w~n",[S1]),
%% ...
Здесь вы можете выполнить сопоставление с образцом в заголовке функции, чтобы избежать вызова element
:
for({S1, Q}) ->
io:fwrite(" ~w~n",[S1]),
R=length(Q),
B=nth(1,Q),
for1 (R,Q),
Pid=spawn(exchange,process,[]),
register(S1,Pid),
S1 ! {sender, S1,R,Q}.
Здесь у нас снова есть паттерн length
+ nth
, на этот раз для for1
, так что мы могли бы также заменить его на lists:foreach
:
for({S1, Q}) ->
io:fwrite(" ~w~n",[S1]),
lists:foreach(fun for1/1, Q),
Pid=spawn(exchange,process,[]),
register(S1,Pid),
S1 ! {sender, S1,R,Q}.
Надеюсь, это поможет - функция for1
не компилируется, когда я ее пробую, но, надеюсь, это поможет вам начать работу.