(広辞苑より)2010年2月5日金曜日Erlang基礎文法最速マスターTweet先日、Lua基礎文法最速マスターを書いてみたが、予想以上に自分自身への学習効果が高かった。そこで、普段使っているPythonと同じぐらいに使いこなしたいと思っていたErlang(アーラン)の基礎文法最速マスターを書いてみることにした。Erlangが関数型プログラミング言語であることもあり、書き下すのは思ったよりも大変だったが、学習効果はかなりあったと思う。言語を習得したいときはこのようなまとめを書いてみるのが良さそうだ。手続き型プログラミング言語に比べて異なる部分があまりにも大きいので、すべてを説明することは難しく、これを読んだだけですぐに使えたりはしないかもしれない。間違っていたり、足りない部分などがあったら、教えて頂けるとありがたい。対話環境コマンドラインからerlを実行すると対話環境(シェル)になります。コマンドの最後にはピリオド(.)が必要です。help()で簡単な説明を読むことができます。ok画面出力io:formatで書式指定の出力を行うことができます。"erlang"]).コメント%から行末までがコメントになります。ブロックコメントはありません。慣例として%%がよく使われます。コメント.変数の代入Erlangの変数の先頭は必ずアルファベットの大文字かアンダーバー(_)になります。一度代入すると後から変更できません。代入した変数のことを束縛変数と呼びます。代入されていない変数のことを未束縛変数と呼びます。変数は動的型付けなので宣言は必要ありません。Aは束縛変数だが、パターン照合が一致するのでエラーにならない.実のところ、=は代入演算子ではなく、パターン照合演算子になります。5のAは未束縛変数であり、どんな値にもパターンが一致するので5の照合が成功して、Aに5が束縛できるのです。5では、既にAは5に束縛されているので、数値の5か、5の値を持つ変数とだけ照合が成功します。Erlangで重要な要素の一つにアトムがあります。アトムとは数値以外の不変値を表すのに使用します。C言語の列挙子などが近い存在です。アトムは通常アルファベットの小文字から始まります。変数に代入することができます。hello.また、先頭文字を大文字にしたり、空白や特殊記号を使用したい場合はシングルクォーテーション(')で囲むことでアトムとなります。atom.'.ある項目を一つにまとめたい場合はタプルを使います。タプルは中括弧({})で括ることにより作れます。10}.タプルから値を取り出す場合、パターン照合を使います。パターンが一致しないのでエラーになり、Eは未束縛変数のまま.いくつかのパターン照合の例を以下に挙げておきます。5]が入る.スクリプトの実行コンパイルして実行するには以下のようにコマンドを実行します。ソースコードをコンパイルするためには、先頭でモジュール名をアトムで指定する必要があり、モジュール名は基本的に拡張子を除いたファイル名が使われます。ソースコードのファイル名がtest.erlであれば、-module(test).と指定します。-exportについては後述の関数の説明を参照してください。stopで終了させています。次に示すように、escriptで実行すればコンパイルは不要ですが、実行時に呼ばれる関数はmain/1となります。-moduleと-exportは必要ありません。worldコマンドライン引数を取る場合は、以下のようにします。数値の表現Erlangは最後がピリオド(.)になるので、1.は整数の1であり、実数の1.0ではありません。実数の1.0にするには、1.0.と書く必要があります。(剰余)インクリメントとデクリメントErlangは関数型言語で代入は一度しかできないので当然インクリメントはできません。リストErlangでは角括弧によりリストを作ることができます。単一代入なので一度作成したリストを変更することはできません。変更したい場合は別のリストを作成します。3].リストの要素への参照Erlangではリストの先頭のインデックスは1となります。ダブルクォーテーション(")で括ると文字列になりますが、Erlangではそれを整数のリストとして扱っています。整数と浮動小数点数の比較以外では==と/=の代わりに、=:=と=/=を使うようにしましょう。関数Erlangでは関数名は必ずアルファベットの小文字から始まり、以下のような構文になります。式N.式はカンマ(,)で区切り、関数の終端はピリオド(.)になります。モジュールの外部から関数を呼び出すためには-exportアノテーションで関数を指定しなければなりません。main([A])を呼び出したい場合、-export([main/1]).のように指定します。これは引数が1つあるmain関数をエクスポートするという意味です。Erlangでは引数の個数のことをアリティと呼びます。因みに、-exportで関数を指定しなくても、-compile(export_all).とすれば、モジュール内の関数すべてを外部から呼び出せます。以下のsum関数は再帰を使ってリスト内のすべての要素を足し合わせます。ここでは引数のパターンが[]と[H|T]の2種類出てきていますが、上から順にパターンが照合され一致する関数が評価されます。それぞれの関数の区切りにはセミコロン(;)が使用されます。sum(T).関数名の右側にあるwhenとはガードと呼ばれるパターンを補助する仕掛けで、このガードの条件を満たさなければパターンが一致していても式は評価されません。以下のsum_odd関数はカードを使って奇数のみを足し合わせています。sum_odd(T).サンプルプログラムとして、ガードを使ってFizzBuzz問題を解いてみます。1から100までを表示する場合はfizzbuzz(100).と実行します。[N]).パターン照合を使って以下のように書くこともできます。5)]).Erlangでは、funを使うことによって無名関数を使うことができます。endパターンを1から順に条件と照合して一致するパターンの式を返します。case文でもガードを使うことができます。50の条件に一致しないので式は評価されません。50の条件とも一致するので式が評価され、アトムthreeがXに入ることになります。最後のパターンtrueはすべての条件と一致します。上述のFizzBuzz問題をcase文とリスト内包表記(後述)を使って1行で書くこともできます。end.for/while文Erlangにはfor文もwhile文もありません。その代わりに関数を使って表現できます。C言語のfor文を使った以下のようなコードについて考えます。}Erlangではこれを以下のように書くことができます。ファイル入出力ファイル操作にはfileモジュールを利用します。W).バイナリデータinput.datを読み込んで、それをoutput.datに2回書き込みます。並行プログラミングmy_server.erlに以下のコードを作成します。モジュール名:関数名/アリティ)のように呼び出します。モジュール名:関数名/アリティは、関数の参照を行うための記法になります。helloメッセージを送ることによりプログラムから返事が返ってきます。上記のプログラムではbyeと送ることで終了します。[引数])のように使うこともできます。[]).並行プログラミングはErlangの存在を際立たせているのですが、ここで扱うには規模が大きすぎるので割愛します。詳しくは参考サイトなどを参照してください。型はありませんが、アトムのtrueとfalseが真偽値のリテラルとして使われます。5]).定義された関数を使う場合は以下のようになります。上述のmap関数はリスト内包表記を使って以下のように書くことができます。25]上述のfilter関数は以下のように書くことができます。Engineメッセージボード*当ブログに関する意見や要望などにお使いください。Googleアカウントでログインすることで書き込みができます。Twitterへの送信を同時に行うこともできます。ストリートビューで散歩*Googleマップのストリートビューを利用して散歩をするWebアプリです。ストリートビューとマップを分割してマーカーを視界タイプに変更することで使いやすくしてあります。APIを利用したグラフ・チャート作成ウェブアプリです。クリック一つで簡単にグラフを作成できます。ブログ記事への貼り付けなどにどうぞ。OpenIDテスト*OpenIDによるログインのテストを行います。mixiであればクリック一つで、他のOpenIDアカウントであればそのURLを入力することでテストできます。一言コメント表示機能付きです。HTML文字変換*テキストで使われているHTML特殊文字をウェブで表示できるようにするための文字変換ウェブアプリです。プログラムのソースコードなどをブログ記事に貼り付けるときなどに便利です。短縮URLチェッカー*フィッシングサイト判別機能付き短縮URLチェッカーです。テキストボックスに変換したいURLを入力すればbit.lyの短縮URLが表示され、bit.lyの短縮URLを入力すればもとのURLが表示されます。展開されたURLがリンク付きで表示されますが、もしフィッシングサイトの疑いがある場合は警告が表示されます。Trendsの急上昇ワードをランキング順に表示します。Googleでのキーワード・画像検索やWikipediaによる用語の説明もあります。※GoogleがAPIの提供を終了したため、現在停止中です。自己紹介noxゲームを楽しむだけの余裕と感性は失いたくないnoxです。