なぜ Haskell で 1-liner っぽいコードが出来るのか、ちょっと真面目に考えた
というわけで今日は真面目に人の書いた Haskell のコードを読んでいたのです。適せん(どうしても変換できない)コメントや改行を入れつつ。
基本的に読みやすいコードなのですが、、、やはり一行 200文字を越える辺りから解読不可能というか恐ろしく読む気が削がれます。開始されて間もないプロジェクトですので、少人数でも、やることだけはある。ガガガと兎に角コードを書いていた。そこに私が飛び込んでビックリしたというのが筋書きのようですね。だからまああまり責めてもしょうがないと言うことは判りました。
問題は、しかし何で一行の長さがこんな長くなってしまったのか、ということです。少しコードに手を入れていてちょっと掴んだような気がしました。
大規模コードをリファクタリングしてパラメータの名前とかを少し変えますと、それにつられて インデントがずれてしまいます。普通の言語なら、その領域をエディタとかで自動的にリインデントすればそれで終わり。(え、愛用の notepad.exe にはそんな機能はない?ご愁傷様です。)でも Haskell のようなオフサイドルールのある言語では上手く行かない。インデント自体がプログラムの意味と密接な関係を持っているので、勝手にリインデントすると意味が変わってしまうからですね。
そうすると、いちいち手でインデントを調整してやらなければいけません。これは、まあ今日自分もちょっとイラッと来たんですが、面倒です。チコチコと TAB を押すだけの簡単なお仕事なのですが。私は haskell-mode だと多分その辺良きに計らってくれる機能があるに違いないと思い込んでいたのですが、買いかぶっていたようです。(あれば教えてください。助かります。)
このインデント調整は改行したら改行しただけ発生するわけですね。これを避けるには、、、そう、改行が本当に必須な時以外は改行しなければ良いわけです。だから自然と一行の文字が多くなるし、ほんとのほんとに改行が必要になったころには、次行のインデントも自然と深くなる。意識しているかはともかく、どうやらこれが理由みたい。
もちろん、何か賢くインデント調整を複数行でパパッとやってしまうトリックというのは私も思いつきましたし、多分そういう機能が elisp で書かれて無ければ書いちゃおうと思っているんですが、まあ皆さん emacs 使ってるわけではなく、、、vi の人もいるし、聞いた事の無いエディタの人もいます。その人たちに、びしっと改行して 80文字にまとめたからこれでやっていっておくれ、と言うのもかわいそうですよね。
どうしたらみんなが幸せになれるんだろうなあ。と、避難訓練中に階段を500段ほど降りている時に考えました。おわり。