¿Puedo deshabilitar la impresión de listas de enteros pequeños como cadenas en el shell de Erlang?
erlang-shell (7)
El shell Erlang "adivina" si una lista dada es una cadena imprimible y la imprime de esa manera para su comodidad. ¿Puede esta "conveniencia" ser deshabilitada?
El problema es que la cadena no es un tipo en Erlang. Una cadena es solo una lista de enteros, por lo que el shell no puede distinguir una cadena imprimible de una lista genérica. No sé si esta respuesta a tu pregunta.
No creo que puedas evitarlo. Preponer un átomo parece un kludge, sí altera tu cadena original.
Normalmente uso listas: aplanar (Cadena) para forzarla a una cadena, especialmente el valor de retorno de io_lib: format () no siempre se imprime como una cadena. El uso de listas: aplanar () en él lo convierte en uno.
Yo uso el siguiente "estilo C":
sprintf(Format) ->
sprintf(Format, []).
sprintf(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)).
No sé si es posible cambiar el comportamiento predeterminado del shell, pero al menos puede formatear su salida correctamente, utilizando el io:format .
Aquí hay un ejemplo:
1> io:format("~p~n", [[65, 66, 67]]).
"ABC"
ok
2> io:format("~w~n", [[65, 66, 67]]).
[65,66,67]
ok
Y como el shell es solo para experimentación / mantenimiento, io:format()
debería ser al menos suficiente para su aplicación real. Tal vez debería considerar escribir su propio método de formato / impresión, por ejemplo, formatPerson()
o algo así, que da formato a todo muy bien.
No, no hay forma de desactivarlo. La mejor alternativa que encuentro es imprimir explícitamente el valor en la consulta (con io:format
o después del hecho hacer io:format("~w/n", [v(-1)])
.
Tiendo a hacerlo al anteponer un átomo a mi lista en el shell.
por ejemplo:
Eshell V5.7.4 (abort with ^G)
1> [65,66,67].
"ABC"
2> [a|[65,66,67]].
[a,65,66,67]
También podría ser [a, 65,66,67], por supuesto. pero [a | fun_that_returns_a_list ()] imprimirá "lo correcto (ish) la mayor parte del tiempo"
A partir de Erlang / OTP R16B , puede usar la función shell: strings / 1 para activarlo o desactivarlo. Tenga en cuenta que también afecta a la impresión de cosas que realmente están destinadas a ser cadenas, como "foo"
en el siguiente ejemplo:
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]}
Puede deshabilitar dicho comportamiento con la función shell:strings/1
comenzando con Erlang R16B.
Solo recuerde que esta es una opción global para todos los shells de nodos, y puede que sea prudente volver a configurarla después de terminar de jugar.