Erlang Language チュートリアル
Erlang言語の使い方
サーチ…
備考
Erlangは、Erlangのミドルウェアとライブラリを集めたもので、Erlang / OTPは堅牢なフォールトトレラントを構築するためにいくつかのEricsson製品でバトルテストされていますErlang / OTPは現在、EricssonのErlang / OTPユニットによって管理されています。 "( erlang.org )
ここで始める
インストール手順については、 インストールのトピックを参照してください。
リンク
- 公式Erlangサイト: https : //www.erlang.org
- ErlangとElixirの両方で人気のあるパッケージマネージャ: http : //hex.pm
- Erlangパターン: http : //www.erlangpatterns.org/
バージョン
こんにちは世界
Erlangで "hello world"アプリケーションを書くときに知っておく必要があることは、次の2つです。
- ソースコードは、選択したテキストエディタを使用してerlangプログラミング言語で書かれています
- その後、アプリケーションはerlang仮想マシンで実行されます。この例では、erlangシェルを使ってerlang VMと対話します。
最初にアプリケーションのソースコード:
以下を含む新しいファイルhello.erl
を作成します。
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
これが意味するものを簡単に見てみましょう:
-
-module(hello).
すべてのerlang関数はモジュール内に存在します 。モジュールは、モジュールの集まりであるアプリケーションを構築するために使用されます。この最初の行は、このモジュール、つまりhelloを識別することです。モジュールはJavaのパッケージと比較できます -
-export([hello_world/0]).
コンパイラにどの関数が "public"(OO言語と比較されるか)と、その関数のアリティを作るように指示します。アーリーは、関数が取る引数の数です。 erlangでは、1つの引数を持つ関数は、2つの引数を持つ関数とは異なる関数として認識されるため、名前はまったく同じでも構いません。つまり、hello_world/0
は、例えばhello_world/1
とはまったく異なる関数です。 -
hello_world()
関数の名前です。->
は、関数の実装(本体)への移行を示します。これは「hello_world()が...と定義されている」と読むことができます。hello_world()
(引数なし)は、VMのhello_world/0
とhello_world(Some_Arg)
hello_world/1
によって識別されることに注意してください。 -
io:format("Hello, World!~n", [])
モジュールio
から、標準出力の関数である関数format/2
関数が呼び出されます。~n
は書式指定子で、改行を出力することを意味します。[]
は、出力文字列に書式指定子で示された印刷する変数のリストです。この場合は何もありません。 - すべてのerlangステートメントは、aで終わらなければなりません
.
(ドット)。
Erlangでは、関数内の最後のステートメントの結果が返されます。
さて、アプリケーションを実行しましょう:
ファイルhello.erl
ファイルと同じディレクトリからerlangシェルを起動します:
$ erl
次のようなプロンプトが表示されます(バージョンは異なる場合があります)。
Eshell V8.0 (abort with ^G)
1>
次のコマンドを入力します。
1> c(hello).
{ok,hello}
2> hello:hello_world().
Hello, World!
ok
それぞれの行を一つずつ進んでみましょう:
-
c(hello)
- このコマンドは、hello
上の関数c
を呼び出します。これは、効果的にErlangにファイルhello.erl
を見つけ、モジュールにコンパイルし(hello.beam
という名前のファイルがディレクトリに生成される)、環境にロードします。 -
{ok, hello}
- これは上記の関数c
を呼び出した結果です。これは、原子ok
と原子hello
を含むタプルです。 Erlang関数は通常{ok, Something}
か{error, Reason}
いずれかを返します。 -
hello:hello_world()
- モジュールhello
から関数hello_world()
呼び出します。 -
Hello, World!
- これが私たちの機能が印刷するものです。 -
ok
-これは私たちの関数が返されたものです。 Erlangは関数型プログラミング言語なので、すべての関数が何かを返します 。私たちの場合、hello_world()
で何も返さなかったにもかかわらず、その関数の最後の呼び出しはio:format(...)
あり、その関数はok
返しました。
モジュール
erlangモジュールは、いくつかの機能がまとめられたファイルです。このファイルの拡張子は.erl
です。
hello.erl
という名前の "Hello World"モジュールが以下に示されています
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello, World!~n", []).
このファイルでは、モジュール名を宣言する必要があります。前の行に示したように.erl
拡張の前のモジュール名とファイル名は同じでなければなりません。
関数
関数は、一緒にグループ化された一連の命令です。これらのグループ化された命令は、一緒に特定のタスクを実行します。 erlangでは、すべての関数は呼び出されたときに値を返します。
以下は、2つの数値を加算する関数の例です
add(X, Y)-> X + Y.
この関数は、XとYの値を持つ加算演算を実行し、その結果を返します。機能は以下のように使用できます
add(2,5).
関数宣言はセミコロンで区切られた複数の節で構成されます。これらの句のそれぞれの引数は、パターンマッチングによって評価されます。次の関数は、引数がフォーム内のタプルである場合は 'tuple'を返します。{test、X}ここでXは任意の値になります。 Argumentが["test"、X]という形の長さ2のリストで、それ以外の場合は '{error、 "Reason"} "を返します。
function({test, X}) -> tuple;
function(["test", X]) -> list;
function(_) -> {error, "Reason"}.
引数がタプルでない場合、2番目の節が評価されます。引数がリストでない場合は、3番目の句が評価されます。
関数宣言は、いわゆる「ガード」または「ガードシーケンス」から構成できます。これらのガードは、関数の評価を制限する式です。ガードを持つ関数は、すべてのガード式が真の値を返すときにのみ実行されます。複数のガードは、セミコロンで区切ることができます。
function_name(Argument) when Guard1; Guard2; ... GuardN -> (...).
関数 'function_name'は、Guard Sequenceがtrueの場合にのみ評価されます。関数X
は、引数X
が適切な範囲(0..15)にある場合にのみtrueを返します。
in_range(X) when X>=0; X<16 -> true;
in_range(_) -> false.
リスト理解
リスト内包表記は、既存のリストに基づいてリストを作成する構文構造です。
エルランでは、リスト内包は[Expr || Qualifier1, ..., QualifierN]
。
修飾子はジェネレータのPattern <- ListExpr
またはinteger(X)
ようなフィルタで、 true
またはfalse
いずれかに評価されます。
次の例は、1つのジェネレータと2つのフィルタを使用したリストの理解を示しています。
[X || X <- [1,2,a,3,4,b,5,6], integer(X), X > 3].
結果は、3より大きい整数だけを含むリストになります。
[4,5,6]
Erlangシェルの起動と停止
Erlangシェルの起動
UNIXシステムでは、erlangシェルをコマンドプロンプトからerl
コマンドで起動します
例:
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1>
シェルの起動時に表示されるテキストは、実行しているErlangのバージョンと、erlangシステムに関するその他の有用な情報を示します。
Windowsでシェルを起動するには、ウィンドウのスタートメニューでErlangアイコンをクリックします。
Erlangシェルの停止
erlangシェルの制御された終了の場合、次のように入力します。
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1> q().
また、Erlangシェルを終了するには、UNIXシステムではCtrl + Cを、WindowsではCtrl + Breakを押すと、次のプロンプトが表示されます。
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
a(中止の場合)を押すと、シェルを直接終了します。
erlangシェルを終了する他の方法は次のとおりです: q()
またはerlang:halt()
と同じことをinit:stop()
パターンマッチング
erlangの最も一般的な操作の1つはパターンマッチングです。これは、変数、関数宣言、およびcase
文やreceive
文のような制御フロー構造体に値を代入するときに使用されます。パターンマッチング操作には、少なくとも2つの部分が必要です。パターンとパターンが一致する用語です。
erlangの変数の代入は次のようになります:
X = 2.
ほとんどのプログラミング言語では、この操作のセマンティクスは簡単です。選択した名前(この場合はX
)に値( 2
)をバインドします。 Erlangは少し異なるアプローチをしています。左側( X
)のパターンと右側( 2
)の語を一致させます。この場合、効果は同じです。変数X
は値2
バインドされています。ただし、パターンマッチングでは、より構造化された割り当てを実行できます。
{Type, Meta, Doc} = {document, {author, "Alice"}, {text, "Lorem Ipsum"}}.
このマッチング演算は、右辺項の構造を解析し、左辺のすべての変数を項の適切な値に適用することによって実行され、左辺が右辺と等しくなる。この例では、 Type
はterm: document
、 Meta
to {author, "Alice"}
、 Doc
to {text, "Lorem Ipsum"}
バインドされてい{text, "Lorem Ipsum"}
。この特定の例では、変数: Type
、 Meta
、およびDoc
は、それぞれの変数を使用できるようにバインドされていないとみなされます。
バインドされた変数を使用して、パターンマッチングを構築することもできます。
Identifier = error.
変数Identifier
が値error
バインドされるようになりerror
。構造体が一致し、バインドされた変数Identifier
値が適切な右側の部分のようになるため、次のパターンマッチング操作が機能します。
{Identifier, Reason} = {error, "Database connection timed out."}.
右手側の用語と左手側のパターンとの間に不一致がある場合、パターンマッチング操作は失敗する。 Identifier
は値error
バインドされているため、右辺項に適切な式がないため、次の一致は失敗します。
{Identifier, Reason} = {fail, "Database connection timed out."}.
> ** exception error: no match of right hand side value {fail,"Database ..."}