在erlang中模拟范围(L,N)

时间:2012-10-14 07:48:03

标签: list erlang range seq

一大早和Erlang一起玩我得到了一个奇怪的结果:

   -module(bucle01).

   -compile(export_all).

   for(N) when N >=0 ->

                lists:seq(1,N).


   for(L,N) when L =< N ->

                lists:seq(L,N);

   for(L,N) when L > N ->

                lists:reverse(for(N,L)).

当我运行程序时,我看到了:

> bucle01:for(1,10).

[1,2,3,4,5,6,7,8,9,10]

> bucle01:for(10,1).

[10,9,8,7,6,5,4,3,2,1]

>bucle01:for(7,10).

[7,8,9,10]

>bucle01:for(8,10).

"\b\t\n"                %% What's that !?!

>bucle01:for(10,8).

"\n\t\b"               %% After all  it has some logic !

任何“不要喝太多”的“Kool-Aid”好吗?

1 个答案:

答案 0 :(得分:7)

Erlang中的字符串只是ASCII数字列表。如果您的列表是数字列表或字符串,Erlang shell会尝试通过查找可打印字符来确定没有元数据。

\b(退格),\t(制表符)和\n(换行符)都是一些常见的ASCII字符,因此shell会显示字符串而不是数字。但是,列表的内部结构完全相同。

Erlang FAQ也涵盖了这一点: Why do lists of numbers get printed incorrectly?
以下是一些防止这种魔法的想法:Can I disable printing lists of small integers as strings in Erlang shell?