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先輩に感謝しつつ〆。

Comments

comments powered by Disqus