オブジェクト指向の記法

[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引数ではなく、最後の引数にしてほしかった。これならば、カリー化への対応にも問題が起こらないから。