Erlang Language
データ型
サーチ…
備考
erlangのすべてのデータ型はTermと呼ばれます。 任意のデータ型を意味する一般名です。
数字
Erlangでは、数値は整数または浮動小数点のいずれかです。 Erlangは整数(bignum)に任意精度を使用するため、その値はシステムのメモリサイズによってのみ制限されます。
1> 11.
11
2> -44.
-44
3> 0.1.
0.1
4> 5.1e-3.
0.0051
5> 5.2e2.
520.0
数字はさまざまなベースで使用できます。
1> 2#101.
5
2> 16#ffff.
65535
$
-prefix表記法は、ASCII / Unicode文字の整数値を返します。
3> $a.
97
4> $A.
65
5> $2.
50
6> $🤖.
129302
原子
アトムは、名前自体によってのみ識別される名前を持つオブジェクトです。
原子はErlangで原子リテラルを使って定義されます。
- 小文字で始まり、文字、数字、アンダースコア、または
@
文字のみを含む引用符のない文字列。 - 一重引用符で囲まれた文字列
例
1> hello.
hello
2> hello_world.
hello_world
3> world_Hello@.
world_Hello@
4> '1234'.
'1234'
5> '!@#$%% ä'.
'!@#$%% ä'
ほとんどのErlangプログラムで使用されている原子
ほとんどのErlangプログラムには、特に標準ライブラリで使用されているため、いくつかのアトムが存在します。
-
true
とfalse
はそれぞれのブール値を示すのに使用されます -
ok
は、通常、効果のためだけに、または戻り値の一部として呼び出される関数の戻り値として使用され、いずれの場合も正常に実行されます - 同様に、
error
は、上位機能からの早期復帰を保証しないエラー状態を示すために使用される -
undefined
は通常、指定されていない値のプレースホルダとして使用されます
タグとして使用
ok
とerror
は、タプルの最初の要素が成功をerror
するタプルの一部として頻繁に使用されerror
が、それ以降の要素には実際の戻り値またはエラー条件が含まれます。
func(Input) ->
case Input of
magic_value ->
{ok, got_it};
_ ->
{error, wrong_one}
end.
{ok, _} = func(SomeValue).
ストレージ
アトムを使用するときに覚えておくべきことの1つは、メモリ内のグローバルテーブルに格納され、このテーブルはガベージコレクションされないため、特にアトム名に影響を与えることができるときに動的にアトムを作成することです。
バイナリとビットストリング
バイナリは、符号なし8ビットバイトのシーケンスです。
1> <<1,2,3,255>>.
<<1,2,3,255>>
2> <<256,257,258>>.
<<0,1,2>>
3> <<"hello","world">>.
<<"helloworld">>
ビットストリングは、ビット長が必ずしも8の倍数ではない一般化バイナリです。
1> <<1:1, 0:2, 1:1>>.
<<9:4>> % 4 bits bitstring
タプル
タプルは、他のアーランの用語の固定長の順序付けられたシーケンスです。タプルの各要素は、任意のタイプの用語(任意のデータ型)にすることができます。
1> {1, 2, 3}.
{1,2,3}
2> {one, two, three}.
{one,two,three}
3> {mix, atom, 123, {<<1,2>>, [list]}}.
{mix,atom,123,{<<1,2>>,[list]}}
リスト
Erlangのリストは、0個以上のErlangの用語のシーケンスであり、単独でリンクされたリストとして実装されています。リストの各要素は、任意のタイプの用語(任意のデータ型)にすることができます。
1> [1,2,3].
[1,2,3]
2> [wow,1,{a,b}].
[wow,1,{a,b}]
リストの先頭はリストの最初の要素です。
リストの末尾は、リストの残りの部分(頭なし)です。それはまたリストです。
hd/1
とtl/1
を使用するか、 [H|T]
と照合して、リストの先頭と末尾を取得することができます。
3> hd([1,2,3]).
1
4> tl([1,2,3]).
[2,3]
5> [H|T] = [1,2,3].
[1,2,3]
6> H.
1
7> T.
[2,3]
要素をリストに追加する
8> [new | [1,2,3]].
[new,1,2,3]
リストを連結する
9> [concat,this] ++ [to,this].
[concat,this,to,this]
文字列
Erlangでは、文字列は別のデータ型ではなく、ASCIIコードまたはUnicodeコードポイントを表す整数のリストです。
> [97,98,99].
"abc"
> [97,98,99] =:= "abc".
true
> hd("ABC").
65
Erlangシェルがリストを印刷しようとすると、実際にそれが文字列かどうかを推測しようとします。 shell:strings(false)
呼び出すことで、その動作を無効にすることができます:
> [8].
"\b"
> shell:strings(false).
true
> [8].
[8]
上記の例では、整数8はバックスペースのASCII制御文字として解釈され、シェルは文字列内の「有効な」文字とみなします。
プロセスID(Pid)
erlangの各プロセスは、このフォーマット<xxx>
プロセス識別子( Pid
)を持っていますx
は自然数です。以下は、 Pid
例です
<0.1252.0>
Pid
は 'bang'( !
)を使用してプロセスにメッセージを送信するために使用できます!
また、 Pid
は変数にバインドできます。両方とも下に表示されています
MyProcessId = self().
MyProcessId ! {"Say Hello"}.
プロセスの作成と一般的なプロセスの詳細については、erlangのプロセスを参照してください。
楽しさ
Erlangは関数型プログラミング言語です。関数プログラミング言語の機能の1つは、データ(機能オブジェクト)としての関数の処理です。
- 関数を引数として別の関数に渡します。
- 関数の結果として関数を返す。
- いくつかのデータ構造で機能を保持する。
Erlangではこれらの関数をfunと呼びます。ファンは無名関数です。
1> Fun = fun(X) -> X*X end.
#Fun<erl_eval.6.52032458>
2> Fun(5).
25
ファンにはいくつかの節があるかもしれません。
3> AddOrMult = fun(add,X) -> X+X;
3> (mul,X) -> X*X
3> end.
#Fun<erl_eval.12.52032458>
4> AddOrMult(mul,5).
25
5> AddOrMult(add,5).
10
また、 fun Module:Function/Arity
: fun Module:Function/Arity
という構文でモジュール関数をfun Module:Function/Arity
として使用することもできます。
例えば、arity 1を持つlists
モジュールから関数max
を取ることができます。
6> Max = fun lists:max/1.
#Fun<lists.max.1>
7> Max([1,3,5,9,2]).
9
地図
マップは、(キー、値)のペアで構成される連想配列または辞書です。
1> M0 = #{}.
#{}
2> M1 = #{ "name" => "john", "age" => "28" }.
#{"age" => "28","name" => "john"}
3> M2 = #{ a => {M0, M1} }.
#{a => {#{},#{"age" => "28","name" => "john"}}}
地図を更新するには:
1> M = #{ 1 => x }.
2> M#{ 1 => c }.
#{1 => c}
3> M.
#{1 => x}
既存のキーを更新する:
1> M = #{ 1 => a, 2 => b}.
2> M#{ 1 := c, 2:= d }.
#{1 => c,2 => d}
3> M#{ 3 := c }.
** exception error: {badkey,3}
パターンマッチング:
1> M = #{ name => "john", age => 28 }.
2> #{ name := Name, age := Age } = M.
3> Name.
"john"
4> Age.
28
ビット構文:デフォルト
ビット構文に関するErlang docの明確化:
4.4デフォルト
[始めの省略:<< 3.14 >>は正当な構文ではありません。]
デフォルトのサイズはタイプによって異なります。 floatの場合は64です。バイナリの場合は、指定されたバイナリの実際のサイズです。
1> Bin = << 17/integer, 3.2/float, <<97, 98, 99>>/binary >>. <<17,64,9,153,153,153,153,153,154,97,98,99>> ^ |<-------------------------->|<------>| | float=64 binary=24 integer=8 2> size(Bin). % Returns the number of bytes: 12 % 8 bits + 64 bits + 3*8 bits = 96 bits => 96/8 = 12 bytes
マッチングでは、Sizeを持たないバイナリセグメントはパターンの最後にのみ許され、デフォルトのSizeはマッチの右側のバイナリの残りの部分です:
25> Bin = <<97, 98, 99>>. <<"abc">> 26> << X/integer, Rest/binary >> = Bin. <<"abc">> 27> X. 97 28> Rest. <<"bc">>
パターン内のバイナリタイプを持つ他のすべてのセグメントは、サイズを指定する必要があります。
12> Bin = <<97, 98, 99, 100>>. <<"abcd">> 13> << B:1/binary, X/integer, Rest/binary >> = Bin. %'unit' defaults to 8 for <<"abcd">> %binary type, total segment size is Size * unit 14> B. <<"a">> 15> X. 98 16> Rest. <<"cd">> 17> << B2/binary, X2/integer, Rest2/binary >> = Bin. * 1: a binary field without size is only allowed at the end of a binary pattern