Erlangにおけるデータ構造の読み込みとダンプ

なんとなく最近Erlangを勉強している.

普段使いの言語でよく使う操作はできるようになりたいので,とりあえずPerlで言うところのData::Dumper, eval相当の操作をErlangでやってみる.


今回はデータ構造の読み込みを行うfile:consultと,その逆操作を行う関数を自作してみる.
Programming Erlangのp.222とp.228より.

  • data1.dat
{person, "joe", "armstrong",
	 [{occupation, programmer},
	  {favoriteLanguage, erlang}]}.

{cat, {name, "zorro"},
      {owner, "joe"}}.

file:consultを使うとそのままデータとして読み込むことができる.

1> {ok, L} = file:consult("data1.dat").
{ok, [{person, "joe", "armstrong",
	 [{occupation, programmer},{favoriteLanguage, erlang}]}.
      {cat, {name, "zorro"},{owner, "joe"}}]}
2> L.
[{person, "joe", "armstrong",
	 [{occupation, programmer},{favoriteLanguage, erlang}]}.
      {cat, {name, "zorro"},{owner, "joe"}}]}

うまく読み込めていることが確認できた.


この逆操作を行うものが存在しないそうなので自前で作成する.(Programming Erlang p.228)

  • lib_misc.erl
-module(lib_misc).
-export([unconsult/2]).

unconsult(File, L) ->
    {ok, S} = file:open(File, write),
    lists:foreach(fun(X) -> io:format(S, "~p.~n", [X]) end, L),
    file:close(S).

作成したモジュールのlib_misc:unconsultの動作を確認する.
lib_misc:unconsultで書き出したファイルをconsultでL2に読み込み,Lと一致するかを確認する.

3> c("./lib_misc")
{ok,lib_misc}
4> lib_misc:unconsult("data2.dat", L).
ok
5> {ok, L2} = file:consult("data2.dat").
{ok, [{person, "joe", "armstrong",
	 [{occupation, programmer},{favoriteLanguage, erlang}]}.
      {cat, {name, "zorro"},{owner, "joe"}}]}
6> L2 == L.
true

念のためdata2.datの中身も見てみる.

% cat data2.dat
{person,"joe","armstrong",
        [{occupation,programmer},{favoriteLanguage,erlang}]}.
{cat,{name,"zorro"},{owner,"joe"}}.

きちんと吐き出せている.


早く並列プログラミングできるようになりたいなぁ.

Reference

Programming Erlang: Software for a Concurrent World

Programming Erlang: Software for a Concurrent World