このエントリーをはてなブックマークに追加

LTSVパーサーをerlangで書いてみた

突然のLTSVブーム、ということで、勉強中のerlangを使ってparserを書いてみました。

それまでerlang(とOTP)という言語自体については少しずつ分かってきたのですが、ベストプラクティスというか、どう書けばいいか、という点やrebarやeunitなどの周辺エコシステムについては全然分かっていませんでした。

そのため、今回の実装をネタにそのあたりを勉強しようかな、と思っていました。

指摘された事項

といっても、自分は実際使っているわけではないので、実際に使っているVoluntas先輩にコードレビューを頂きながら、指摘してもらいました。

  • dictは遅いから使わない
  • stringは遅いから使わない
  • 基本binary(listにすると遅くなる)
  • lists:append/2を使わない。 [Data|Acc] という形式で
  • io:get_line/2 は使わない。一行毎に読みたいならfile:read_line/1
  • rebar.configにはxrefを入れる
  • warningはerrorにする(https://github.com/voluntas/snowflake/blob/develop/rebar.config)
  • getはbuilt inにあるので関数名に使わない

specの書き方

bashoさんのriakでは %%@spec という書き方がされていますが、

%% @spec parse_file(string()) -> [[{binary(), binary()}]].
parse_line(Line) -> ok.
%% という書き方ではなく、

-spec parse_file(string()) -> [[{binary(), binary()}]].
%% @doc parse LTSV file
parse_line(Line) -> ok.
%% という書き方

をするといいそうです。これにより、自動でドキュメントが生成されます。@docはどっちでも、というぐらいだそうです。

起きた問題

./rebar eunitしてもテストが実行されない

lrtsb.app.srcを作っていないのが原因でした。rebar create-app appid=ltsvで作成しました。simplemodでは要らないかと思ってました。

ということで

文法からは分からない、erlangの実際のコードについて指摘を頂いたので、誰かの役に立つかと思いまとめてみました。V先輩に感謝しつつ〆。