2010-03-19 8 views

Respuesta

6

io_lib: printable_list podría ser lo que estás buscando. Sin embargo, no maneja unicode solo codificaciones latin-1. Si necesita detectar cadenas Unicode, creo que no tendrá suerte. La mejor opción es pseudo escribir sus listas de la siguiente manera: {cadena, [$ a, $ b, $ c]}. Tipo de construir tus tipos.

usa un constructor como el string (L) cuando is_list (L) -> {string, L}.

y simplemente use esa construcción de escritura a través de su aplicación.

Por otro lado, podría tratar todas las cadenas como solo listas y no hacer la distinción.

+0

Gracias. Sí, pensé en este pseudo tipado, pero no sabía si era una buena manera de hacer las cosas en Erlang. – Zubair

+0

Otra opción que he visto utilizar es mantener todas las cadenas como binarias. –

3

Lo mejor que puedes hacer es etiquetar tus estructuras como Jeremy Wallsuggested. De todos modos se puede decidir de entrada cheque a su módulo/subsistema/aplicación/...

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

Por desgracia, es operación costosa y no se puede utilizar en guardias.

+0

Pero luego una lista aparecería como una cadena en su ejemplo, ¿es correcto? – Zubair

+0

No entiendo la pregunta. ¿Te refieres a algo como 'new_string (X) -> true = is_string (X), {string, X} .'? Entonces la respuesta es sí. –

0

¿Por qué tendrías que separarlos? Las cadenas son listas en erlang (la mayoría de las veces).

+1

La razón más común por la que necesitaría hacer esto es una lista anidada en un árbol donde algunas de las sublistas son cadenas que deben tratarse como una entrada de lista, no como un subárbol. Sin etiquetar la lista, las operaciones como aplanar y atravesar árboles se vuelven mucho más difíciles. –

+0

Correcto, en ese caso secundo su solución con pseudo-tipado ya que es una forma de construir su propia forma de flujo de control. – Weasel

3

Erlang implementa diferentes funciones para probar si una lista es plana en el módulo io_lib. A pesar del comentario de Jeremy Wall, hay una función para probar si una lista plana contiene caracteres unicode y latin1.

Si desea probar para las listas de Unicode planos se pueden utilizar io_lib: lista_caracteres (Plazo) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib: lista_caracteres/1 implementación de la función es:

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. 

Una buena opción para el control de Las cadenas codificadas en latin1 son io_lib: lista_char_latina1 (Término) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib: lista de carga_local/1 implementación de función es :

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. 

Compruebe la documentación del módulo io_lib para ver otras funciones similares.

+0

Incluso su respuesta es perfectamente correcta, no tiene que rechazar mi respuesta. Fue perfectamente correcto a tiempo cuando lo respondí.Busque la fecha y cuando el soporte Unicode se agregó a 'io_lib' en la distribución de ERL/OTP. –

Cuestiones relacionadas