[erlang] - практическая задача - покритикуйте решение
От: DemAS http://demas.me
Дата: 12.02.09 11:12
Оценка:
Небольшой этап первой практической задачи на 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
Re: [erlang] - практическая задача - покритикуйте решение
От: Mikl Kurkov Россия  
Дата: 12.02.09 12:41
Оценка: +1
Здравствуйте, DemAS, Вы писали:


DAS>Небольшой этап первой практической задачи на Erlang — прочитать файл и

DAS>составить список из слов в него входящих. Покритикуйте, пожалуйста, код:

DAS>...


Лучше когда открытие\закрытие ресурса локализованы в одной функции, а не разбросаны по коду.
Для простого разбора строк есть готовая string:tokens/2.
Операция Acc ++ [NewElem] неэффективна, так как копируется весь Acc,
лучше использовать [NewElem | Acc] и lists:reverse(Acc) при выводе результата.

DAS>Кстати, стоит ли избавляться от переменных в методах?

DAS>...

DAS>Просто второй вариант мне кажется менее читабельным. Хотя, наверное, это с

DAS>непривычки.

Тут вопрос личных предпочтений по-моему. Я обычно стараюсь обходиться без дополнительных переменных.

--
Mikl
Re: [erlang] - практическая задача - покритикуйте решение
От: ArtDenis Россия  
Дата: 13.02.09 16:19
Оценка:
Небольшое замечание: если в твоём случае критично использование памяти, то лучше не использовать списки целых знвчений для хранения текстовых данных, т.к. такие списки очень расточительно используют память. В этом случае лучше оперировать с бинарными данными.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.