2010-03-19 7 views
5

목록이나 문자열을 인수로 사용할 수있는 프로그램을 작성 중입니다. Erlang에서 프로그래밍 방식으로 문자열과리스트의 차이를 어떻게 알 수 있습니까? 다음과 같이 입력하십시오 :항목이 얼랑의 문자열인지 목록인지 판단

print(List) -> list; 
print(String) -> string. 

답변

6

io_lib : printable_list가 당신이 원하는 것일 수 있습니다. 그러나 유니 코드 전용 latin-1 인코딩은 처리하지 않습니다. 유니 코드 문자열을 감지해야하는 경우 운이 좋지 않을 수도 있습니다. 가장 좋은 방법은 다음과 같이 목록을 의사 적으로 입력하는 것입니다 : {string, [$ a, $ b, $ c]}. 당신 타입의 빌드 종류.

is_list (L) -> {string, L} 일 때 string (L)과 같은 생성자를 사용하십시오.

그냥 앱에서 타이핑 구문을 사용하십시오.

한편으로는 모든 문자열을 목록으로 취급하고 구별하지 않아도됩니다.

+0

감사합니다. 네,이 의사 타이핑에 대해 생각해 봤지만, 얼랭에서 일을하는 것이 좋은 방법인지는 몰랐습니다. – Zubair

+0

사용 된 다른 옵션은 모든 문자열을 바이너리로 유지하는 것입니다. –

3

당신이 할 수있는 최선의 작업은 구조체에 Jeremy Wallsuggested으로 태그를 지정하는 것입니다. 어쨌든 당신은

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

불행하게도 비싼 작업입니다 당신이 경비에 사용할 수 없습니다/... 모듈/서브 시스템/응용 프로그램에 체크 입력을 결정할 수 있습니다.

+0

하지만 목록은 예제에서 문자열로 표시됩니다. 맞습니까? – Zubair

+0

질문을 이해할 수 없습니다. 'new_string (X) -> true = is_string (X), {string, X} '와 같은 것을 의미합니까? 그래서 대답은 '예'입니다. –

0

왜 이것을 분리해야합니까? 문자열은 erlang의 목록입니다 (대부분의 경우).

+1

이 작업을 수행해야하는 가장 일반적인 이유는 하위 목록 중 일부가 하위 트리가 아닌 목록 항목으로 처리해야하는 문자열 인 트리의 중첩 목록입니다. 태그를 지정하지 않으면 플랫 튼 (flatten)이나 트리 트래버스 (tree traversal)와 같은 연산이 훨씬 어려워집니다. –

+0

그럴 경우 자신의 제어 흐름을 구축하는 방법 인 것처럼 가상 타이핑을 사용하여 솔루션을 선택해야합니다. – Weasel

3

Erlang은 목록이 모듈 io_lib의 플랫 목록인지 테스트하기 위해 다른 기능을 구현합니다. Jeremy Wall 주석에도 불구하고 플랫 목록에 latin1 버전뿐만 아니라 유니 코드 문자가 포함되어 있는지 테스트하는 기능이 있습니다.

당신은 당신이 사용할 수있는 평면 유니 코드 목록을 테스트하려면 io_lib : char_list (기간) http://erlang.org/doc/man/io_lib.html#char_list-1

io_lib가 : char_list/1 기능의 구현은 다음과 같습니다 확인하는

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. 

하나 개의 좋은 선택 latin1_char_list (용어) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

가 io_lib : latin1_char_list/1 기능 구현이 라틴 부호화하는 문자열이다 io_lib :

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. 

다른 유사한 기능에 대해서는 io_lib 모듈 설명서를 확인하십시오.

+0

당신의 대답조차 완벽하게 정확합니다, 당신은 내 대답을 downvote하지 않아도됩니다. 내가 대답 할 때가 완전히 맞았습니다.날짜와 Unicode 지원이 Erlang/OTP 배포에서'io_lib'에 추가 된 날짜를 찾아보십시오. –

관련 문제