Могу ли я отключить печатные листы небольших целых чисел в виде строк в оболочке Erlang?

Оболочка Erlang "угадывает" , является ли данный список печатаемой строкой и печатает его таким образом для удобства. Это "удобство" может быть инвалиды?

Ответы

Ответ 1

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

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

Ответ 2

Я не знаю, возможно ли изменить поведение оболочки по умолчанию, но вы можете, по крайней мере, правильно отформатировать свой вывод, используя 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() или что-то в этом роде, которое хорошо форматирует все.

Ответ 3

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

например:

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) большую часть времени"

Ответ 4

С 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]}

Ответ 5

Нет, нет возможности отключить его. Лучшая альтернатива, которую я нахожу, - либо явно распечатать значение в запросе (с помощью io:format), либо после этого сделать: io:format("~w\n", [v(-1)]).

Ответ 6

Я не думаю, что вы можете это предотвратить. Превращение атома похоже на kludge - он изменяет вашу исходную строку.

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

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

sprintf(Format) ->
     sprintf(Format, []).
sprintf(Format, Args) ->
    lists:flatten(io_lib:format(Format, Args)).

Ответ 7

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