4

早朝に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 !

「飲み過ぎないで」への「クールエイド」はありますか?

4

1 に答える 1

7

Erlang の文字列は、単なる ASCII 番号のリストです。Erlang シェルは、メタデータなしで、印刷可能な文字を探すことによってリストが数字のリストなのか文字列なのかを判断しようとします。

\b(バックスペース)、\t(タブ)、および\n(改行) はすべて、ある程度一般的な ASCII 文字であるため、シェルは数字ではなく文字列を表示します。ただし、リストの内部構造はまったく同じです。

これは、Erlang の FAQ に も記載されています。
そして、この魔法を防ぐためのいくつかのアイデアがあります: Erlang シェルで小さな整数のリストを文字列として出力することを無効にできますか?

于 2012-10-14T08:18:55.230 に答える