Я собираюсь пойти на это, будучи ошибкой в Эрланге, и странной. Изменение строки формата на «~ 2s» дает одинаково странные результаты:
["59","73","4","15","2","40","0","92","6","53","0","6","34",
"10","5","1","87","8","6","81","61","9","5","66","5","7",
"25","6",
[...]|...]
Похоже, что он считает символ новой строки как обычный символ для целей подсчета, но не когда дело доходит до вывода. Loopy как весь ад.
Неделя программирования на Erlang, и я уже углубляюсь в источник. Это может быть новая запись для меня ...
EDIT
Еще одно расследование подтвердило, что это ошибка. Вызов одного из внутренних методов, который используется в fread
:
> io_lib_fread:fread([], "12 13\n14 15 16\n17 18 19 20\n", "~d").
{done,{ok,"\f"}," 1314 15 16\n17 18 19 20\n"}
По сути, если нужно прочитать несколько значений, тогда начинается новая строка, первая строка новой строки в части строки, которая еще должна быть прочитана. Другое тестирование предполагает, что, если вы добавляете пробел, все в порядке, и если вы начинаете строку с новой строки, она запрашивает больше.
Я собираюсь докопаться до сути, черт возьми ... (ухмыляясь) Не так много кода, через который нужно пройти, и не так уж много конкретно посвящено переводу строк, поэтому не стоит слишком много времени, чтобы сузить и исправить это.
EDIT ^ 2
ХА ХА! Получил маленький гвоздик.
Вот патч для stdlib, который вы хотите (не забудьте перекомпилировать и сбросить новый файл луча поверх старого):
--- ../erlang/erlang-12.b.3-dfsg/lib/stdlib/src/io_lib_fread.erl
+++ ./io_lib_fread.erl
@@ -35,9 +35,9 @@
fread_collect(MoreChars, [], Rest, RestFormat, N, Inputs).
fread_collect([$\r|More], Stack, Rest, RestFormat, N, Inputs) ->
- fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, More);
+ fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, [$\r|More]);
fread_collect([$\n|More], Stack, Rest, RestFormat, N, Inputs) ->
- fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, More);
+ fread(RestFormat, Rest ++ reverse(Stack), N, Inputs, [$\n|More]);
fread_collect([C|More], Stack, Rest, RestFormat, N, Inputs) ->
fread_collect(More, [C|Stack], Rest, RestFormat, N, Inputs);
fread_collect([], Stack, Rest, RestFormat, N, Inputs) ->
@@ -55,8 +55,8 @@
eof ->
fread(RestFormat,eof,N,Inputs,eof);
_ ->
- %% Don't forget to count the newline.
- {more,{More,RestFormat,N+1,Inputs}}
+ %% Don't forget to strip and count the newline.
+ {more,{tl(More),RestFormat,N+1,Inputs}}
end;
Other -> %An error has occurred
{done,Other,More}
Теперь, чтобы отправить мой патч в erlang-patches и пожинать полученную славу и славу ...