Erlang 入門

何か新しい言語を習得しよう!そうしよう!と思い立ち、話題のモテ系言語 Erlang の勉強を決意しました。

オブジェクト指向プログラミング言語、それも JavaC++ を大学でちょろっと触ってたくらいのペーペーのボクが、関数型言語なんてスマートでアカデミックな雰囲気の言語に触るなんて恐れ多いや!

Erlang の素敵なトコロやあまり素敵でないところは Wikipedia:Erlang で。
以下導入に関してのメモと簡単な入門編。楽しく学んでいきたいと思います。

環境

Windows XP SP2

導入

  1. 公式サイトから Windows 用のバイナリファイルを落とします
  2. インストールします
  3. PATH を通します
    • マイコンピュータを右クリック、「プロパティ」を選択
    • 「詳細設定タブ」 → 「環境変数」 を選択
    • 「システム環境変数」の PATH を選択、「編集」を選択
    • 「変数値」に Erlang をインストールしたフォルダのアドレスを入力
      • ex. C:\Program Files\erl5.6.4\bin
    • 「OK」* 3

Erlang シェルの起動

  • コマンドプロンプトを起動します
    • ボクが良くやる方法は [Win] + [r] で「ファイル名を指定して実行」ウィンドウを開き、「cmd」と入力するやり方です :)
  • 「erl」と入力して、エンター!
  • おぉぉ!Erlang のシェルが起動しましたね!


変数

下のように入力してみます。

1> X = 2 + 4.
6
2> a = 2 + 4.
** exception error: no match of right hand side value 6
3> Y = X + 4.
10
4> X = X + 4.
** exception error: no match of right hand side value 10
5> X.
6
6> Y.
10

いったい何が起こっているのでしょうか。
Erlang では

  • 変数は大文字で始まる
  • = は パターン照合を表す
    • (Javaなどのように) 代入を意味する訳ではない
    • 左辺の変数が未束縛 (=unbound) の場合にのみ、右辺を評価したもので束縛 (=bound) する
    • つまり、一度束縛された変数の値を変更することは出来ない
    • ↑のおかげで、副作用を防ぎ並列化が容易になる

アトム (Atom)

整数以外の不変 (=immutatble) な値を表すのに使います。
先頭は小文字から始まります。
' (= single quatation) で囲むことにより、先頭が大文字のものもアトムとして認識されます。

1> hello.
hello
2> Message = goodbye.
goodbye
3> Message.
goodbye
4> Say = 'Hello World!'.
'Hello World!'
5> Say.
'Hello World!'

タプル (Tuple)

タプルとは、好きな数の要素を 1 つにまとめたものです。
表現したい値を , (=comma) で区切り、{} (=braces) で囲います。
慣例的に、タプルの最初の要素はタプルが表している要素の名前を入れることが多いようです。

タプルの中にタプルを入れることももちろん可能デス!

1> Age = {age, 24}.
{age,24}
2> Name = {name, suke}.
{name,suke}
3> Person = {Name, Age, {studying, erlang}}.
{{name,suke},{age,24},{studying,erlang}}

タプル内の値を取得する

パターン照合演算子 = を使ってタプル内の値をバインドしてみましょう。

4> {{name, WhatName}, {age, HowOld}, {studying, WhatStudying}} = Person.
{{name,suke},{age,24},{studying,erlang}}
5> WhatName.
suke
6> HowOld.
24
7> WhatStudying.
erlang

何が起こっているのでしょうか。
最初に述べたように、 = はパターン照合です。左辺の値が右辺とマッチしているかを調べます。
左辺と右辺がマッチし、左辺の値が未束縛の場合そこに値を束縛します。
今回の場合、左辺と右辺がマッチし、
左辺の WhatName, HoOld, WhatStudying に右辺の値が束縛されたのです。

リスト (List)

リストとは個数が決まっていない要素の値を格納したものです。
表現したい値を、, (=comma) で区切り [] (=brackets) で囲います。
リストの各要素は、アトム、タプル、リストなどどのような型でも構いません。

1> L = [1, 2, 3, 4, 5].
[1,2,3,4,5]
2> Schedule = [{study, 120}, {lunch, 60}, {work, 240}].
[{study,120},{lunch,60},{work,240}]

リスト内の値を取得、追加する

区切り文字 (|)を使う事によって、リスト内の値を取り出すことが出来ます。
リストの先頭の値を ヘッド と呼び、その他の要素を テール と呼びます。

3> [Done1|Schedule1] = Schedule.
[{study,120},{lunch,60},{work,240}]
4> Done1.
{study,120}
5> Schedule1.
[{lunch,60},{work,240}]

何が起こっているのでしょうか。
3 行目で Schedule を ヘッダ と テールに分け、それぞれ Done1 と Schedule1 に束縛しています。

6> NewSchedule = [{dinner, 60}|Schedule].
[{dinner,60},{study,120},{lunch,60},{work,240}]
7> NewSchedule.
[{dinner,60},{study,120},{lunch,60},{work,240}]

新しく要素 {dinner, 60} をリストのヘッダに追加しました。


では、簡単なソースファイルを書いてみましょう!

Erlang 開発環境

IDE がいくつかあるようですが、まだバグ多いみたい。
Meadow 使おう。Meadow

.emacs に下記を追記。

;; Erlang
(setq load-path (cons  "C:/Program Files/erl5.6.1/lib/tools-2.6.1/emacs" load-path))
(setq erlang-root-dir "C:/Program Files/erl5.6.1")
(setq exec-path (cons "C:/Program Files/erl5.6.1/bin" exec-path))
(require 'erlang-start)

(add-hook 'erlang-mode-hook 'erlang-font-lock-level-3)

"erl5.6.1" は自分の使っている環境に合わせて変更してください。

エディタ の使い方

ボクがよく使う方法です。
画面を二分割 (C-x 2 又は C-x 3) して、片方を Erlang シェルに、片方をエディタとして使用しています。

ソースファイルを書いてみる

math.erl というファイルを作成して、以下のように書いてみましょう。
引数の 2 乗を返す小さなプログラムです。

-module(math).
-export([square/1]).

square(X) -> X * X.

なんとなく意味は分かると思います。
説明は後ほど。。。

コンパイル

C-c C-k で開かれているソースコードコンパイルされます。

実行してみる

1> c("c:/erl/math", [{outdir, "c:/erl/"}]).
{ok,math}
2> math:square(5).
25

なにが起こったのでしょう

ソースコード 1 行目: モジュール名 (Java で言うところのクラス名みたいなもの) を定義します。モジュール名.erl がファイル名になります。
ソースコード 2 行目: 外部で使用できるファンクション名 (Java で言うところのメソッド名みたいなもの) を指定します。
-export([fun_name/N]) の N は、アリティと呼ばれ、引数の数を表します。
ソースコード 4 行目: math:square(5) が呼ばれると、パターン照合が行われ、引数の X に 5 が束縛されます。そして → の後の式が評価され、25 が返されました。

さぁ、飛び立とう!

まだ無名関数や、例外処理、重要な平行プログラミングのテクニックなど沢山学ぶべきことがありますが、
とりあえず、これで Erlang の世界に飛び立つ準備は出来ました!
後は下記参考サイトを見つつ、 プログラミング Erlang を読みつつ、一緒に並列世界で楽しくコードを書いていきましょう!

参考

Thinking in Erlang (Japanese version) - http://www.scribd.com/doc/44221/Thinking-in-Erlangの日本語版。とりあえずコレを読んでお勉強。
Erlang World - 日本語の Erlang 解説サイトの中ではとても見易く解りやすいです。ココを見れば上の解説もいらないとおもた。
Erlang -- erlang - BIF (=Built In Function: 組込関数) 一覧。サンプルも載っていて便利!
Erlang クエックブック - サンプルが豊富。
書籍検索 | Ohmsha - プログラミング Erlang 書籍内で使用されているコード。

プログラミングErlang

プログラミングErlang