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