Старый стал
30 строк кода в день — маловато как-то.
С другой стороны — иногда оно вот такое:
parse_task_info(Data) ->
{_, Dict} = parse_task_info(Data, #s{dict = dict:new()}),
Dict
.
parse_task_info([], S) -> {[], S#s.dict};
parse_task_info([$" |T], S) when S#s.s =:= kquote -> parse_task_info(T, S#s{token = [$"|S#s.token], s = kvalue});
parse_task_info([$" |T], S) when S#s.s =:= nquote -> parse_task_info(T, S#s{token = [$"|S#s.token], s = nvalue});
parse_task_info([H |T], S) when S#s.s =:= kquote orelse S#s.s =:= nquote -> parse_task_info(T, S#s{token = [H|S#s.token]});
parse_task_info([$ |T], S) -> parse_task_info(T, S);
parse_task_info([$= |T], S) when S#s.s =:= start -> parse_task_info(T, S#s{key = lists:reverse(S#s.token), token = «», s = kvalue});
parse_task_info([$( |T], S) when S#s.s =:= start -> parse_task_info(T, S#s{token = «», s = name});
parse_task_info([$( |T], S) when S#s.s =:= kvalue ->
{Tn, Dict} = parse_task_info(T, S#s{root = sjoin(S#s.root, S#s.key), token = «», s = name}),
parse_task_info(Tn, S#s{dict = Dict, s = start, token=»"})
;
parse_task_info([$) |T], S) when S#s.s =:= name -> parse_task_info(T, S#s{key = lists:reverse(S#s.token), token = «», s = nvalue});
parse_task_info([$" |T], S) when S#s.s =:= kvalue -> parse_task_info(T, S#s{token = [$"|S#s.token], s = kquote});
parse_task_info([$" |T], S) when S#s.s =:= nvalue -> parse_task_info(T, S#s{token = [$"|S#s.token], s = nquote});
parse_task_info([$, |T], S) when S#s.s =:= start ->
{T, S#s.dict}
;
parse_task_info([$, |T], S) when S#s.s =:= kvalue ->
Dict = dict:store(sjoin(S#s.root,S#s.key), lists:reverse(S#s.token), S#s.dict),
parse_task_info(T, S#s{dict = Dict, token = «», s = start})
;
parse_task_info([$,|T], S) when S#s.s =:= nvalue ->
Dict = dict:store(sjoin(S#s.root,S#s.key), lists:reverse(S#s.token), S#s.dict),
{T, Dict}
;
parse_task_info([$}|T], S) when S#s.s =:= start ->
{T, S#s.dict}
;
parse_task_info([${|T], S) when S#s.s =:= nvalue ->
{Tn, Dict} = parse_task_info(T, S#s{root = sjoin(S#s.root, S#s.key), token = «», s = start}),
parse_task_info(Tn, S#s{dict = Dict, s = start, token=»"})
;
parse_task_info([H|T], S) -> parse_task_info(T, S#s{token = [H|S#s.token]})
.
sjoin(«», «») -> «»;
sjoin(«», N2) -> N2;
sjoin(N1, «») -> N1;
sjoin(N1, N2) -> N1 ++ «.» ++ N2.
а я думал хуже перла уже ничего и не придумали …
Ответить
Fyodor Ustinov отвечает на Август 14th, 2010 19:26:
Да ладно, что тут непонятного? :)
Ответить
dimas отвечает на Август 14th, 2010 19:28:
если бы оно так легко читалось — ты бы не плакался :)
кстати, а почему Эрланг? реальная потребность, или просто пощупать захотелось?
Ответить
Fyodor Ustinov отвечает на Август 14th, 2010 19:38:
Ну читается для меня уже действительно легко. Писалось со скрипом, это да. С другой стороны — это парсер на FSM, его на чем не пиши…
Эрланг — потому что на него решаемая задача уж больно хорошо ложится.
Ответить
dimas отвечает на Август 14th, 2010 19:40:
А потом будет вакансия с винегретом языков, когда тебе надоест это поддерживать :)))
Ответить
Fyodor Ustinov отвечает на Август 14th, 2010 19:44:
Ну, ерланг нормальным программером изучается за пару недель.
Поддерживать ерланговский код на самом деле значительно проще.
Язык постепенно становится распространённым, так что знать его просто надо.
P.S. Если я начну писать это на перле — проще будет переписать всё с нуля, если что. :)
Ответить
Я бы N1 ++ «.» ++ N2. заменил на [N1|["."|[N2]].
Выполняется эффективней.
Ответить