2010-03-19 10 views

Antwort

6

io_lib: printable_list könnte das sein, was Sie suchen. Es behandelt jedoch nicht Unicode nur Latin-1-Kodierungen. Wenn Sie Unicode-Strings erkennen müssen, sind Sie wahrscheinlich nicht glücklich. Die beste Wette ist die Pseudo-Eingabe Ihrer Listen wie folgt: {string, [$ a, $ b, $ c]}. Wie baue ich deine Typen?

Verwenden Sie einen Konstruktor wie so string (L) wenn is_list (L) -> {string, L}.

und verwenden Sie einfach diese Eingabe Construct alle über Ihre App.

Auf der anderen Seite könnten Sie alle Strings nur als Listen behandeln und nicht unterscheiden.

+0

Danke. Ja, ich dachte an diese Pseudo-Typisierung, aber ich wusste nicht, ob es ein guter Weg war, Dinge in Erlang zu tun. – Zubair

+0

Eine andere Option, die ich gesehen habe, ist, alle Zeichenfolgen als Binärdateien zu behalten. –

3

Die beste Sache, was Sie tun können, ist Ihre Strukturen als Jeremy Wallsuggested zu markieren. Auf jeden Fall können Sie überprüfen Eingang zu Ihrem Modul/Subsystem/application/...

is_string([]) -> true; 
is_string([X|T]) -> is_integer(X) andalso X>=0 andalso is_string(T); 
is_string(_) -> false. 

Leider entscheiden es teuer Betrieb ist, und man kann es nicht in Wachen verwenden.

+0

Aber dann würde eine Liste in Ihrem Beispiel als String angezeigt, ist das korrekt? – Zubair

+0

Ich verstehe die Frage nicht. Meinst du so etwas wie 'new_string (X) -> true = is_string (X), {string, X}. Also ist die Antwort ja. –

0

Warum sollten Sie diese trennen? Strings sind Listen in Erlang (die meiste Zeit).

+1

Der häufigste Grund hierfür sind verschachtelte Listen in einer Struktur, in der einige der Unterlisten Strings sind, die als Listeneintrag und nicht als Unterbaum behandelt werden müssen. Ohne die Liste zu markieren, werden Operationen wie "flatten" und "traversal" wesentlich schwieriger. –

+0

Richtig, in diesem Fall habe ich Ihre Lösung mit Pseudo-Typisierung, da es eine Möglichkeit ist, Ihren eigenen Kontrollfluss zu erstellen. – Weasel

3

Erlang implementiert verschiedene Funktionen, um zu testen, ob eine Liste eine flache Liste in Modul io_lib ist. Trotz Jeremy Wall-Kommentar gibt es eine Funktion, um zu testen, ob eine flache Liste Unicode-Zeichen sowie Latin1-Version enthält.

Wenn Sie möchten, für flache Unicode-Listen testen, die Sie verwenden können io_lib: char_list (Term) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib: char_list/1 Funktion Implementierung ist:

char_list([C|Cs]) when is_integer(C), C >= 0, C < 16#D800; 
     is_integer(C), C > 16#DFFF, C < 16#FFFE; 
     is_integer(C), C > 16#FFFF, C =< 16#10FFFF -> 
    char_list(Cs); 
char_list([]) -> true; 
char_list(_) -> false. 

Eine gute Wahl für die Überprüfung Latin1 codierte Strings ist io_lib: latin1_char_list (Begriff) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib: latin1_char_list/1 Funktion Implementierung ist :

latin1_char_list([C|Cs]) when is_integer(C), C >= $\000, C =< $\377 -> 
     latin1_char_list(Cs); 
latin1_char_list([]) -> true; 
latin1_char_list(_) -> false. 

Weitere ähnliche Funktionen finden Sie in der Dokumentation zum io_lib-Modul.

+0

Sogar Ihre Antwort ist vollkommen korrekt, Sie müssen meine Antwort nicht ablehnen. Es war vollkommen richtig in der Zeit, als ich antwortete.Sehen Sie sich das Datum an und wann die Unicode-Unterstützung zu "io_lib" in der Erlang/OTP-Distribution hinzugefügt wurde. –

Verwandte Themen