Небольшой этап первой практической задачи на Erlang — прочитать файл и
составить список из слов в него входящих. Покритикуйте, пожалуйста, код:
-module(ft).
-export([process_file/0]).
process_file()->
{ok, Device} = file:open("data.txt", [read]),
Lines = get_all_lines_in_file(Device, []),
process_all_lines(Lines, []).
get_all_lines_in_file(Device, Accum)->
case io:get_line(Device, "") of
eof ->
file:close(Device),
Accum;
Line ->
get_all_lines_in_file(Device, Accum ++ [Line])
end.
process_all_lines([T|H], Accum)->
NewAccum = get_all_words_in_line(T, Accum),
process_all_lines(H, NewAccum);
process_all_lines([], Accum) ->
Accum.
get_all_words_in_line(Line, Accum)->
case string:chr(Line, $ ) of
0 ->
Accum ++ [Line];
Idx ->
get_all_words_in_line(string:substr(Line, Idx + 1), Accum ++ [lists:sublist(Line, Idx)])
end.
Кстати, стоит ли избавляться от переменных в методах?
Вместо:
Lines = get_all_lines_in_file(Device, []),
process_all_lines(Lines, []).
писать:
process_all_lines(get_all_lines_in_file(Device, []), []).
?
Просто второй вариант мне кажется менее читабельным. Хотя, наверное, это с
непривычки.
Posted via RSDN NNTP Server 2.1 beta
Небольшое замечание: если в твоём случае критично использование памяти, то лучше не использовать списки целых знвчений для хранения текстовых данных, т.к. такие списки очень расточительно используют память. В этом случае лучше оперировать с бинарными данными.