Aug 13, 2013

第2章 必ず帰って来てねの巻 前篇

あんたー!待ってるからねーーー!!

。。。さて、タイトルの意味は後々長々と語るとして、

今回は、いつもお世話になっているforループの話です。
大体の言語には、構文としてforが準備されていると思います。
java, c, php ... 大体のプログラム言語には、for文ありますよね?

しかし、Erlangをそこら辺の言語と一緒にしちゃダメですよ。
彼からすると

「for文?なにそれおいしいの?」

な状態です。
つまり、for文なんていう高度な技は、
Erlangでは使用できません!以上。

以上じゃねえ!!\(゜ロ\)(/ロ゜)/

じゃあ繰り返し操作とかどうすんじゃ?
大丈夫です。安心してください。できます。
彼もやればできる子なのです。

ではでは、それを語るためには、「関数型言語」なので
繰り返し操作を語る前にまずは「関数」について語りたいと思うのじゃ。。。

関数を定義しよう


まずは、関数について、これは、JavaやC言語と同じように
Erlangでも処理の結果を返却するように「関数」の定義が可能です。


ではではまずは、与えられた引数を足し算して返却するような簡単な関数を考えてみましょう。

Javaで書くとこんな感じでしょうか。メソッド[add]を定義してみます。
public int add(int num1, int num2) {
    return num1 + num2
}

ではではお待ちかね、Erlangで書くとこうなります。
Erlangで関数[add]を定義してみます。
add(Num1, Num2) ->
    Num1 + Num2.

以上です。簡単な関数の定義については、ほかの言語と、ぱっと見た感じ
あまり変わりません。

因みにFunctionの定義をするときには、

[関数名](引数たち) ->
    [関数でやりたい処理]
.

こんな感じで定義します。そんなに難しくないでしょ?今のところは。。。

しかし、上記の例だけでもちょっと「?」な部分があります。

関数の戻り値

Erlangでは、Functionは「常に戻り値を返却する」必要があります。

!!\(◎o◎)/!

まぁそこまでビビる話ではないのですが、Erlangではvoidは使えません。
常に何かしらの結果値を返却する必要があります。
たとえば、今更ながらにHello Worldを書いてみましょう。

ではでは、Erlangエミュレータを起動してみましょう~。

※ Erlangエミュレータの起動方法は、Linux上もしくは、Windowsのコマンドラインから
  ErlangをインストールしたフォルダのbinにPATHを通した状態で、erlコマンドを実行してください。
  Windowsの場合は、
  スタート>プログラム>Erlang OTP R[インストールしたバージョン]>Erlang
  で起動すると専用のWindowsアプリケーションが起動するのでこちらのほうが便利かもです。

起動が終わったら下のコマンドを実行しましょう

> io:format("Hello world~n").
Hello world
ok
>


こんな感じに出力されたと思います。
この自分で入力した、"Hello World"以外にokなる出力が出てきてますが、
これは、io:format/1の戻り値です。

それと、もうひとつ重要なのが、

全てのErlangプログラムの式についても戻り値が返却される

ということです。関数内においては
最後に実行した式の結果値が返却されます。
因みに後々説明しますが、

if文やcase文も戻り値を返却します!

。。。意味不明。。。orz

まずは、その話は置いておいてっと、

関数のさわりはこれだけ、覚えていればOKです。
因みに最後に上記のFunctionをちゃんとビルドして実行できるようにしておきましょう。

まずは、[sample.erl]なるファイルを準備してください。
で、細かい話は後々しますので、以下の内容を書き殴りましょう。

% モジュールの定義をします
% ここにはファイル名と同じ名前を定義してください。
-module(sample).

% モジュールの外部に公開するFunctionを定義します。
% ここでは、addを外部公開しましょう
-export([add/2]).

add(Num1, Num2) ->
    Num1 + Num2.

上記のファイルが準備できたら、そのファイルを保存したフォルダ上で
Erlangエミュレータを起動してください。

※ Erlangエミュレータの起動方法は、Linux上もしくは、Windowsのコマンドラインから
  ErlangをインストールしたフォルダのbinにPATHを通した状態で、
  erlコマンドを実行してください。

起動したら、以下のコマンドを実行しましょう。
このコマンドは、erlファイルをコンパイルして中間ファイルbeamファイルを
生成して、モジュールをロードしてくれるコマンドです。
んー簡単いうと、作ったFunctionを実行できるようにする呪文です。


> c("sample").
{ok, sample}
>


で、ここで{ok, sample}と結果が返却されていれば準備OKです。
ではでは、実行してみましょう。


> sample:add(1,2).
3
>


無事作った関数が、実行できました!

やっふー!

さて、これでようやくFor文の説明の前準備ができました。。。が!!

次回に続く!!!

次回予告

For文についてなんて1ページで十分と思って書き始めたのに
さっくり説明するだけでもかなりの行数になってしまっため2話構成になってしまった!!

次回「必ずかえって来てねの巻 後編」 この次もサービスはないのです。

第一章 束縛する男はもてるのか?の巻

わたくしのことではないですよ。Erlang君です。

 さて、どんなプログラム言語も変数ってありますよね。
当然、Erlangにもあります。もちろんです。
でも、ちょっと普通とは違います。

 。。。それは、変数には1度しか代入処理ができない!!!

 \(゜ロ\)(/ロ゜)/

 意味がわかりません。でも、ほんとの話です。

 では例を挙げてみましょう。

Javaで以下のような処理、意味ないですが、問題ないですよね。

int num = 0;
num = num + 1;
上記の例をErlang君で書くとすると
※ 因みにErlangでは、変数は大文字で始まるのがルールです

Num = 0.
Num = Num + 1.


こんな感じになるのですが、因みにこれエラーです。
1行目で変数「Num」は0で束縛されたので変更はできません!!
CやJavaの様に変数の値を変えることはできないのです。
因みにどうしても値を1加算したい場合どうするのか?
簡単です。別の変数に値を入れればよいのです。

Num = 0.
Num1 = Num + 1.

Erlangでは1度変数に対して代入操作を行うと
その値で束縛されるので、以降代入を行うことはできません。
Javaでたとえると。。常に変数の宣言にfinalをつけまくってる状態

って言えばわかりやすいでしょうか。Cで言うとConstでしょうか。

本日の教訓



Erlangでは変数への値の代入を束縛という!
一度束縛した変数は異なる値を束縛することはできない!
束縛する男は嫌われる

次回予告

なんだって!For文が使えないだって?!!
をお送りする予定です

序章 Erlangってなんだ??

Erlang・・・こんな開発言語があるというのは、
今回、開発にかかわるまでは、恥ずかしながらまったく知りませんでした。
で、色々Google先生に聞いてみると以下のような特徴がある言語ということです。


  • 関数型言語である
  • 並列処理が得意である
  • 関数型言語の割には、学習しやす?(※ ほかの言語と比べて!)
  • OTPを使うと何やら耐障害性に優れている


という特徴が挙げられます。



Erlangの起源について


元々は、Ericsson社内でのみ利用されていた独自開発言語だったものを
1998年にオープンソース化し、一般に公開され誰でも
利用できるうになったということだそうです。

思惑としては、とくていきぎょうからのどくりつせいとかとか
はたまた、Erlangに対する知名度の向上とからしいです(日本では現在のところ残念ながら。。。)


Erlangの語源について


デンマークの数学者 アグナー・クラルプ・アーラン(Agner Krarup Erlang)の名前から
という説とエリクソン・ランゲージ(Ericsson Lanquage)からという2つの説があるようですが
どちらも正解というのが中の人たちの話らしいです。


Jul 15, 2013

プロローグ

西暦201X年・・・・


どこにでもいるしがない30も中盤を超えたおっさんエンジニアが名前もきいたこともない

「嗚呼乱(Erlang)」

なる関数型言語という難問に立ち向かい、少しずつ理解できていったような
どんどんおかしな解釈をしているような奮闘記です。