「すごいErlangゆかいに学ぼう!」1章の途中〜3章

すごいErlangゆかいに学ぼう!」の読書メモ。

今日は1章の最後のバイナリ処理から、3章のパターンマッチの話まで。

前回ふと思ったこと

16進→2進のような変換はどう書くのか。

245> WallHex = 16#802b1200.             
2150306304
246> erlang:integer_to_list(WallHex, 2).
"10000000001010110001001000000000"

こうかな? なお、この数値は、ビットボンバーマンの例題から引用。

バイナリデータ

Erlangでは、バイナリのパターンマッチができる。

バイナリ演算にはbsl, bsr, band, bor, bxor, bnotを使う。

バイナリ文字列

<<hoge moga>>

バイナリ文字列は、あまり操作しない文字列を保存するときや、省メモリを心がける必要があるときに使う。

バイナリ文字列をタプルのタグに使ってはいけない。反対に、文字列としてアトムを使うのもいけない。

バイナリ内包表記

バイナリに値を代入したりバイナリから値を抽出したりする処理が、簡潔に書けるという話。

サンプルコードを書いてみたいけど、あまりピンとこない。関連する話が出てきたらまた戻ってこよう。

モジュール

ここから第2章。

モジュールを作るには、最初にモジュール自身の名前を属性として定義する。モジュール名とファイル名は一致させなければコンパイルされない。

関数の中ではreturnを使わない。

モジュールの外から関数を使えるようにするために、関数名と引数の数をexportする。

モジュールのimportをすることで、モジュール名:関数名という記述からモジュール名を省くことができるけれど、あまりやらないらしい。プログラムを書く人には便利だど、可読性が下がるからとのこと。そういえば、先日のどう書くでHaskell使いのトウマさんが同じことを言ってたなぁ。

Erlangシェルの中から、次のようにすればコンパイルできる。

c(モジュール名).

コンパイラオプションとしてデバッグフラグを渡したいときは、次のようにする。

c(モジュール名, [debug_info]).

マクロ

defineマクロの話。

defineで定義した関数をexportしようとすると、そんな関数ないってコンパイル時に怒られる。関数マクロはモジュールprivateとして使うべきってこと?

-define(sub(X,Y), X-Y).
-export([add/2, hello/0, greet_and_add_two/1, sub/2]).

マクロで関数の定義をすると読むのが辛いから、なるべくやらない方がいいとは思う。

関数の構文

ここから第3章。

パターンのブロックを書いた関数節をセミコロンで繋げて、関数宣言にまとめる方法について。関数宣言の最後はピリオド。

束縛する変数

パターンマッチを使って2つの引数が同じかどうかを返す関数が載っている。シンプルで印象的。

same(X,X) ->
    true;
same(_,_) ->
    false.

パターンマッチには、形が合っていれば何でも受け付けてしまうという限界がある。パターンマッチは、リテラルの数値、アトム、N個の要素のタプルというような抽象的な値、未束縛の変数などしか識別できない。その問題を解決するためには、ガードというものを使うらしい。

今日はここまで〜。