Perlのはなし

今週はずっとPerlを書いていたのでいろいろ。

コンテキストつらい。

コンテキストがどういうものかは『初めてのPerl』とPlackなどのコードを通して概要をハハンと掴んでいた程度で実際に付き合いはじめたのは今回が初めて。

使ってみての印象は最悪で動的型付けと静的型付けの悪いところを合わせたよう。

リファレンスも印象が悪い。

配列とそのリファレンスが別にあって組み込みの関数は配列のリファレンスには適用できなかったり、散々。

後方互換性を確保するという思想は結構なことだけど、スコープとかリファレンスとか、「ちゃんと書く」ためにキーワードをいちいち書かなきゃいけないとかっていうのは、道具として失敗だと思う。

オブジェクトへの安心感が足りない。Rubyはオブジェクトが自分自身についてあらゆることを知っていて、わからないことがあればオブジェクトに聞けばよい。Pythonはドキュメンテーションへのアクセサが関数やクラスに備わっている。

PHPを馬鹿にできないほどトップレベルに関数が散らばっていて、perldocを引かないとわからない。

何より致命的なのがこれらの問題はほぼ間違いなくこれから先ずっとPerl 5が抱え続けるということだ。悪く変わることもないだろうが良く変わることもない。

いろいろ書いてきたけど、ふたつ、Perlでコードを書いてよい発見もあった。

ユニットテストを書くことで安心感が得られるという体験ができた。

Rubyは慣れすぎてしまって、Red -> Green -> Refactorという手順を辿るのが回り道に感じられて非常に億劫になるのだけど、慣れない言語で慣れないコード (アルゴリズム、データ構造) を書くときには非常に安心できる。

本当に単純なユニットテストと実装のイテレーションで進めていった。

  1. is_nil は真偽値を返してほしいので単純な例 (nil に対して is_nil を呼ぶ) でテスト
  2. 実装は sub is_nil { }
  3. 次に簡単なnilっぽくなさそうな値に対して is_nil を呼ぶテスト
  4. 実装は sub is_nil { my ($self) = @_; $self->head ? 1 == 1 : (); } みたいなかんじ
  5. 三角計量で新たなnilっぽくない値についてのテスト
  6. 実装を詰める

という具合。本当に乳飲み子のようなかんじでテストと実装を書いていた。

Test::Moreは本当にシンプルなライブラリだけど必要最低限のものはあるといったかんじ。
オブジェクトの等価性 (neq 等値) のテストがリファレンスとかごちゃごちゃしているのもあっていまいちうまく書けなかったけど、まあだいたいよいかんじ。

普通に書くとテストの件数を意識しなきゃいけなかったりだるいので、subtestを使ってRSpecのdescribe/contextっぽく使ってゴリゴリ書いている。

昨日書いたコードのだめなところ、イケてないところが次の日に見えてくるといったかんじで急勾配の学習曲線を描いているのがよくわかる。

Perlを書いていてぎりぎり苦にならない。楽しくない一方で興味深いかんじ。さっさと書けてさっさとテストできるのがいい。Scalamaven使っても走るのが遅くてだるすぎた。

Perlでも自動テストとかしたい。

  • 任意のタイミング (ファイル保存時など) で勝手にprove
  • 更新があった実装とテストだけprove

みたいなことがしたい。

シェルスクリプト + αというかんじだった言語が、という風に言われることも多いが、所詮、PythonRubyPerl + αみたいなかんじだし、おもしろい言語 (たとえばIoとか) と流行る言語、生き延びる言語がよい言語とは限らない。 (JavaとかCとかへの回想をする)

今年中にCPANでおふざけでないモジュールを出してYAPCとかで諜ってPerlについてなにか考えるのをやめにする、という予定を立てた。