Perlテックブログ

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

複素数型のリファレンス - SPVM開発日記

今、SPVMにリファレンス型を実装しているところ。数値型のリファレンスはできて、もうひとつ、値型のリファレンスを実現しなくちゃ。

値型というのは、複素数型のように、複数の数値型を持つ型で以下のように定義できる。

package SPVM::Complex_d2 : value_t {
  re : double;
  im : double;
}

この値型は、オブジェクトを作成しないで、スタック上に、値を保持してくれるので、アクセスするのに、ヒープを参照しに行く必要がない型だ。

やりたいことは、この型のリファレンスをサブルーチンの引数として渡して、結果を受け取れること。

たとえば、以下のように。

  sub ref_sum_compex : double ($x_in1 : SPVM::Complex_d2, $x_in2 : SPVM::Complex_d2, $x_out : SPVM::Complex_d2\) {
    $x_out->{re} = $x_in1->{re} + $x_in2->{re};
    $x_out->{im} = $x_in1->{im} + $x_in2->{im};
  }

第三引数が、「SPVM::Complex_d2\」というリファレンス型になっていて、これは、ちょうどC++の参照「Foo&」と同じ意味にしたい。

数値計算ライブラリを見ていると、複素数型のポインタを渡している関数が、ときどきある。パフォーマンスコストを増さずに、自然にラッピングできるためには、値型のリファレンスを実装する必要がある。