Perlの感想へのコメント

http://d.hatena.ne.jp/technohippy/20080903 で、Perlの文法に対する不満が述べられています。実は不満がある人ばかりだったようで、いつリリースされるか分かりませんが一応Perl6で変更が入ります。

関数定義

Perl6では以下のように書けるようになる予定です(http://en.wikipedia.org/wiki/Perl_6#Major_changes_from_Perl_5)。

sub do_something(Str $thing, Int $other) { ... }

Perl5形式の関数定義では、性能改善が難しいという問題もあったらしいです(http://dev.perl.org/perl6/doc/design/apo/A06.html)。

Sigil

プレフィックスというかSigilと呼ぶらしいのですが、この使い方もPerl6では変更されて配列の要素は @var[0] と表現することになります。

Perl5の書き方も一応理由があったようでしたが、スクリプトを読み書きする人間の側では「配列はいつも@」と認識しておく方が楽という事でしょうか。

オブジェクト指向について

Perlの言語機能にはクラスもオブジェクトも存在しないです。つまり、

package TestClass;

という記述は、クラスではなくパッケージの定義をしています。また、パッケージの中では以下のように関数を記述しますが、

sub method {
    my $self = shift;
    ....
}

これもメソッドではなく、単に関数の定義です。Perlではコンストラクタ等も言語の要素にはありません。

$obj = TestClass->new();

は、TestClassクラスのオブジェクトを作っているのではなく単に変数へのリファレンスを作っています。どんな変数へのリファレンスかはnew関数の中身に依存しますが、ハッシュ変数で実装することが多いです。


詳しくはperldocのperlbootなどを読んでみたり、近くのPerlが得意な人に聞いてみるといいかもしれません。JavaRubyとは非常に違ったシステムになっていて、手短に説明するのは難しいです。


個人的には、Perlオブジェクト指向はクラスやオブジェクトの概念が言語仕様上に無いにもかかわらず

  1. パッケージや関数を外側から結び付けてオブジェクト指向を実現している
  2. シンタックスシュガーの組み合わせで、なんだかC++でオブジェクトを扱っているような雰囲気になる
  3. 動的束縛や継承に相当する機能もある

という精巧というかトリッキーな?仕組みが、ユニークで面白いと思ってます。


しかし分かりにくいのは間違いなく、私も長い間「package AAA;」でAAAクラスを定義していると誤解していました。キーになる関数がblessという名前なのも、意味とか考えてしまうと「祝福???」とか混乱の元です(少なくとも日本人には分かりにくいのでは)。


また「使いにくい」、「C++とかのオブジェクト指向とは違う」とか「回りくどい」と感じるのも確かで
Class::InsideOut、Spiffy、Moose等、この辺りを改善したいというモジュールも沢山あります。


Perl6では一応、以下のような書式が導入されるようです(http://dev.perl.org/perl6/doc/design/apo/A12.html)。

class Point {
    has $.x;
    has $.y is rw;

    method clear () { $.x = 0; $.y = 0; }
}