2010-03-19 87 views
5

我正在编写一个程序,该程序可以具有列表或字符串作为参数。我如何在Erlang中以编程方式说明字符串和列表之间的区别。喜欢的东西:确定项目是Erlang中的字符串还是列表

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

回答

6

io_lib:printable_list可能是你在找什么。但是它不处理unicode只有拉丁-1编码。如果你需要检测unicode字符串,我认为你可能会运气不好。最好的办法是伪造你的列表,如下所示:{string,[$ a,$ b,$ c]}。一种建立你的类型。

当is_list(L) - > {string,L}时,使用像string(L)这样的构造函数。

而只是使用该键入构建全部通过您的应用程序。

另一方面,你可以将所有的字符串视为列表而不是区分。

+0

谢谢。是的,我确实想到了这种伪打字,但我不知道这是否是在Erlang做事的好方法。 – Zubair 2010-03-19 20:16:17

+0

我见过的另一个选项是将所有字符串保存为二进制文件。 – 2010-03-24 15:41:18

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 2010-03-19 21:40:25

+0

我不明白问题。你的意思是像'new_string(X) - > true = is_string(X),{string,X} .''吗?所以答案是肯定的。 – 2010-03-19 22:50:51

0

为什么你需要分开这些?字符串是erlang中的列表(大部分时间)。

+1

您需要这样做的最常见原因是树中的嵌套列表,其中一些子列表是需要被视为列表条目而不是子树的字符串。没有标记列表操作,如扁平化和树遍历变得更加困难。 – 2010-03-24 15:42:15

+0

没错,在这种情况下,我使用伪打字来解决您的解决方案,因为这是构建您自己的控制流程的一种方式。 – Weasel 2010-03-25 18:32:58

3

Erlang实现了不同的函数来测试列表是否是模块io_lib中的扁平列表。尽管Jeremy Wall评论有一个函数来测试一个平面列表是否包含unicode字符以及latin1版本。

如果你想测试你可以使用平的unicode列表 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编码的字符串是io_lib:latin1_char_list(Term) http://erlang.org/doc/man/io_lib.html#latin1_char_list-1

io_lib:latin1_char_list/1 function implementation is :

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

即使你的回答是完全正确的,你不需要冷静地回答我的答案。当我回答时,这是完全正确的。查找日期,并在Erlang/OTP分发中将Unicode支持添加到'io_lib'时。 – 2017-04-09 09:13:51

相关问题