オブジェクト指向の記法
[id:lethevert:20050809:p1]の続き
メソッドの記述を「obj.getX()」と書くか、「getX obj」と書くかは、意外に大きな違いではないかと思います。なぜか?
「getX obj」と書けば、これは、「getX :: obj -> x」という関数なので、「getY obj」とは同じ型の関数として、map関数を使って
xlst = map getX objlst ylst = map getY objlst
が簡単にかけますけど、
「obj.getX()」の記法の場合は、「obj.getY()」などのメソッドとあわせて、同じ型のメソッドを簡単にmap関数に渡す方法がなかなか上手く思いつかない。めんどくさいけど、下のようにラッパー関数を入れないと無理? でも、これは、上のような記法に変換して解決したわけで、「obj.getX()」の記法のまま解決したことにはなってないよね。
int myGetX (obj) { return obj.getX(); } int myGetY (obj) { return obj.getY(); } xlst = map(myGetX, objlst); ylst = map(myGetY, objlst);
たとえば「@」などのキーワードを導入して、「obj.getX()」が「@getX(obj)」に等しい、みたいな仕様を言語自体に導入すれば、
xlst = map(@getX, objlst);
とかけるね。
-
-
- -
-
Perlのオブジェクト指向の実装方法なら、上の問題はとくに障害にならなさそう。
つまり、オブジェクトを下のように書くのです。http://www.pure.ne.jp/~learner/program/Perl_oo.html
#!/usr/bin/perl package MyClass; sub new{ my $pkg = shift; bless{ x => shift, },$pkg; } sub getX{ my $self = shift; $self->{x}; } sub setX{ my $self = shift; $self->{x} = shift; }
つまり、「obj->getX()」と「MyClass::getX(obj)」とが、言語的に同じものとみなされるのです。これならば、オブジェクト指向的記述と、関数的記述が無理なく同居できます。
惜しむらくは、
sub setX($newX, $self){ $self->x = newX; }
となっていないこと。つまり、Selfオブジェクトを第1引数ではなく、最後の引数にしてほしかった。これならば、カリー化への対応にも問題が起こらないから。