Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

無名サブルーチンの実装 - SPVM開発日記

無名サブルーチンが比較的簡単に実装できそうなので、作ってみる。ほかの言語ではラムダと呼ばれているが、Perlでは無名サブルーチンと呼ばれる。

たとえば、sort関数でどのように比較するかを指定する関数を書きたいとする。こういう場合は、無名サブルーチンの出番だ。

sort_obj($objects, sub : int ($self : self, $p1 : Point, $p2 : Point) {
  if ($p1->{x} > $p2->{x}) {
    return 1;
  }
  else if ($p1->{x} < $p2->{x}) {
    return -1;
  }
  else {
    return 0;
  } 
});

SPVMには、継承がない代わりに、インターフェースがあって、これはgoと同じ実装だと思う(きっと)。インターフェースには、フィールドは定義できないで、サブルーチンの定義だけを定義できる。

世にいうダックタイピングというものだけど、インターフェースで定義されたすべてのサブルーチン定義を満たせば、代入できるというやつ。

仕組み

  1. 無名サブルーチンは、無名パッケージのシンタックスシュガーとなる。
  2. つまり、無名サブルーチンは、無名パッケージから作られたオブジェクトである。
  3. 無名パッケージに定義されている無名のサブルーチンは、関数定義が適合(名前がない、戻り値はint、引数は($self : self, $p1 : Point, $p2 : Point))すれば、sort_objの第二引数に代入できる。