Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?

プログラミングErlang - 構文

4章あたり。

関数の参照

現在のモジュールや別のモジュールで定義されている関数を参照するには以下の方法がある。

  • fun LocalFunc/Arity
    • 現在のモジュールにあるLocalFuncという名前でArity個の引数を取る関数を参照するにはこの記法を使う。
-module(x1).
-export([square/1, ...]).
square(X) -> X * X.
...
double(L) -> lists:map(fun square/1, L).
  • fun Mod:RemoteFunc/Arity
    • モジュールModにあるRemoteFuncという名前でArity個の引数を取る関数を参照するにはこの記法を使う。
-module(x2).
...
double(L) -> lists:map(fun x1:square/1, L).
%% fun x1:square/1 は、モジュールx1 にある関数square/1 を意味する。

アンダースコア変数

コンパイラが特別扱いする変数。

通常、節の中で変数が一度しか使われていないことはエラーの兆候であるため、コンパイラは警告を発する。
しかし、節の中で変数が一度しか使われていなくても、変数名がアンダースコアで始まっていれば警告メッセージは出力されない。

アンダースコア変数には主に2 つの使い途がある:

  • 利用するつもりのない変数に名前を付ける場合。
    • 例えば、open(File, _) と書くよりもopen(File, _Mode) と書いたほうがプログラムが読みやすくなる。
  • デバッグ用途に使う場合

リスト操作

リスト操作の++と--。

++ と-- はそれぞれリストの結合と差分を得る中置演算子。

  • A ++ B はA とB を結合(追加)する。
  • A -- B はリストA からB を差し引く。差し引くというのは、B の要素すべてをA から取り除くこと。

あるシンボルX がB の中にK 回しか出てこない場合、
A に出てくるX のうち最初のK 個だけが取り除かれることに注意すること。

1> [1,2,3] ++ [4,5,6].
[1,2,3,4,5,6]
2> [a,b,c,1,d,e,1,x,y,1] -- [1].
[a,b,c,d,e,1,x,y,1]
3> [a,b,c,1,d,e,1,x,y,1] -- [1,1].
[a,b,c,d,e,x,y,1]
4> [a,b,c,1,d,e,1,x,y,1] -- [1,1,1].
[a,b,c,d,e,x,y]
5> [a,b,c,1,d,e,1,x,y,1] -- [1,1,1,1].
[a,b,c,d,e,x,y]

文字集合

Erlang のソースコードファイルはISO-8859-1 (Latin-1) 文字集合でエンコードすることになっている。
つまり、Latin-1 の表示可能な文字はエスケープシーケンスを使わずに利用できる。

内部的には、文字データ型はErlang にはない。実際には文字列というものは存在せず、
整数のリストとして表現されている。
Unicode 文字列は整数のリストとしてまったく問題なく表現できるが、
Erlang の整数リストを使ってUnicode ファイルを解析したり生成するための機能は限られている。

コメント

Erlang ではコメントはパーセント記号(%)で始まり、行の終端までがコメントになる。
ブロックコメントはない。

コードの例ではパーセント記号を2つ続けたもの(%%)がよく出てくる。
2つのパーセント記号はEmacs のerlang モードで認識され、コメント行の自動インデントが有効になる。

インクルード

コンパイル時にファイルをインクルードする方法

ファイルをインクルードするには以下の構文を使う:

-include(Filename).

Erlang では、インクルードファイルには拡張子hrlを付けることになっている。
FileNameには、プリプロセッサが適切なファイルを見つけられるような絶対パスまたは相対パスも含める。
ライブラリのヘッダファイルは次のような構文でインクルードできる

-include_lib(Name).

%% 例えば:
%% -include_lib("kernel/include/file.hrl").
%% この場合、Erlang コンパイラが適切なインクルードファイルを見つけてきてくれる

インクルードファイルにはレコードの定義を入れておくことが多い。
複数のモジュールで同じレコード定義を使わなければならない場合、
共通のレコード定義をインクルードファイルに入れておいて、
レコード定義を必要とするモジュールではそのファイルを必ずインクルードする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment