Можно ли отключить печать списков маленьких целых чисел в виде строк в оболочке Erlang? - PullRequest

Ответы [ 7 ]

20 голосов
/ 27 февраля 2010

Я не знаю, возможно ли изменить поведение оболочки по умолчанию, но вы можете по крайней мере правильно отформатировать вывод, используя io: format .

Вот пример:

1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok

И поскольку оболочка предназначена только для экспериментов / обслуживания, io:format() должно быть как минимум достаточно для вашего реального применения. Возможно, вам следует также написать свой собственный формат / метод печати, например, formatPerson() или что-то в этом роде, которое все хорошо форматирует.

8 голосов
/ 27 февраля 2010

Я склонен делать это, добавляя атом в мой список в оболочке.

например:

Eshell V5.7.4  (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]

также может быть [a, 65,66,67], конечно. но [a | fun_that_returns_a_list ()] будет печатать «правильные вещи (ish) большую часть времени»

7 голосов
/ 23 сентября 2014

Такое поведение можно отключить с помощью функции shell:strings/1 , начиная с Erlang R16B.

Просто помните, что этот параметр является глобальным для всех оболочек узлов, и, возможно, было бы разумно установить его обратно после завершения воспроизведения оболочки в более длинных живых узлах.

5 голосов
/ 23 сентября 2014

Начиная с Erlang / OTP R16B , вы можете использовать функцию shell: strings / 1 для включения или выключения. Обратите внимание, что это также влияет на печать вещей, которые на самом деле должны быть строками, например, "foo" в следующем примере:

1> {[8,9,10], "foo"}.
{"\b\t\n","foo"}
2> shell:strings(false).
true
3> {[8,9,10], "foo"}.   
{[8,9,10],[102,111,111]}
2 голосов
/ 28 февраля 2010

Нет, нет возможности отключить его. Лучшая альтернатива, которую я найду, - это либо явно распечатать значение в запросе (с io:format), либо после того, как факт:

1 голос
/ 10 марта 2010

Я не думаю, что вы можете предотвратить это. Добавление атома кажется клуджем - оно меняет вашу исходную строку.

Обычно я использую list: flatten (String) для принудительного перевода в строку - особенно возвращаемое значение io_lib: format () не всегда печатается как строка. Использование списков: flatten () делает его единым целым.

Я использую следующий «C-стиль»:

sprintf(Format) ->
     sprintf(Format, []).
sprintf(Format, Args) ->
    lists:flatten(io_lib:format(Format, Args)).
0 голосов
/ 27 февраля 2010

Проблема в том, что строка не является типом в Erlang. Строка - это просто список целых чисел, поэтому оболочка не может отличить печатную строку от общего списка. Не знаю, если это ответ на ваш вопрос.

...