2010-02-27 6 views

risposta

7

È possibile disattivare tale comportamento con shell:strings/1 function iniziando con Erlang R16B.

Ricorda solo che questa è l'opzione globale per tutte le shell dei nodi, e potrebbe essere saggio ripristinarla dopo aver terminato di giocare la shell in nodi viventi più lunghi.

19

Non so se è possibile modificare il comportamento predefinito della shell, ma è possibile almeno formattare correttamente l'output, utilizzando io:format.

Ecco un esempio:

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

E dal momento che il guscio è solo per la sperimentazione/manutenzione, io:format() dovrebbero essere almeno sufficiente per il vostro applicazione reale. Forse dovresti anche considerare di scrivere il tuo formato/metodo di stampa, ad es. formatPerson() o qualcosa del genere, che formatta tutto bene.

+0

So di formato io: e probabilmente dovrei averlo menzionato nella domanda :) –

+0

Questo è esattamente quello che stavo cercando quando avevo bisogno di stampare una lista di interi come una stringa. Grazie! – Matt

0

Il problema è che la stringa non è un tipo in Erlang. Una stringa è solo una lista di numeri interi, quindi non c'è modo per la shell di distinguere una stringa stampabile da una lista generica. Non so se questa risposta alla tua domanda.

+0

Prova a inserire '[65,66,67] .' e' [1,2,3] .' nel tuo guscio ... – Zed

+0

@Zed: ne ero consapevole. Ma immagino di aver frainteso la domanda. Ora ho quello che sta cercando di fare. Grazie. –

7

Tendo a farlo anteponendo un atom alla mia lista nella shell.

ad esempio:

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

potrebbe anche essere [a, 65,66,67], naturalmente. ma [a | fun_that_returns_a_list()] stamperà "la cosa giusta (ish) la maggior parte delle volte"

2

No, non c'è modo di disattivarlo. L'alternativa migliore che trovo è quella di stampare esplicitamente il valore nella query (con io:format) o dopo il fatto: io:format("~w\n", [v(-1)]).

1

Non credo che tu possa impedirlo. La preordina di un atomo sembra un kludge: altera la tua stringa originale.

Io di solito uso le liste: flatten (String) per forzarlo su una stringa - specialmente il valore di ritorno di io_lib: format() non sempre viene stampato come una stringa. Usare le liste: flatten() su di esso lo rende unico.

Io uso il seguente "C-style":

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

As of Erlang/OTP R16B, è possibile utilizzare la funzione shell:strings/1 per attivare questa acceso o spento. Si noti che colpisce anche la stampa delle cose che sono in realtà destinati ad essere stringhe, come ad esempio "foo" nel seguente esempio:

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