SPVMはCPANモジュールです。cpanまたはcpanmを使ってインストールできます。
cpan SPVM cpanm SPVM
SPVMのチュートリアルです。
最初の簡単な例として配列の和を求めてみましょう。
「MyMath.spvm」というファイルファイルをlibディレクトリの中に作成してください。SPVMのソースファイルの拡張子は「.spvm」です。以下の内容を記述しましょう。
# lib/MyMath.spvm package MyMath { sub sum : int ($nums : int[]) { my $total = 0; for (my $i = 0; $i < @$nums; $i++) { $total += $nums->[$i]; } return $total; } }
SPVMではパッケージ構文を使用して、パッケージを作成します。Perlのパッケージブロック構文と同じ文法です。
# パッケージ構文 package MyMath { }
パッケージのブロックの中ではサブルーチンの定義を行うことができます。
package MyMath { sub sum : int ($nums : int[]) { } }
SPVMは静的型言語ですので、サブルーチンの宣言の中で、戻り値の型、引数名と引数の型を記述します。
戻り値は「int型」。引数は「int型の配列」です。int型は、32bit符号付整数を表現します。
配列の和を計算している部分をみてみましょう。
my $total = 0; for (my $i = 0; $i < @$nums; $i++) { $total += $nums->[$i]; } return $total;
和の計算方法の見た目は、Perlでfor文を使って書いたものとまったく同じです。
このようにSPVMではMPerlと同じ文法で記述できるのがひとつの特徴です。Perlユーザーが、新しい文法を覚える負担ができるだけ小さくなるように設計されています。
変数の宣言では型推論を使って、型を省略することができます。
my $total = 0;
SPVMの型推論は、右辺の型が確定しているときに、左辺の型宣言を省略することができます。
数値リテラルの「0」は「int型」ですので、「$total」の型も「int型」になります。以下の記述と同じ意味になります。
my $total : int = 0;
配列の長さは「@」を使うことで取得できます。
@$nums
SPVMには、コンテキストはなく「@」は常に配列の長さを返します。
次にSPVMで書かれたサブルーチンをPerlの側から呼び出してみましょう。
「sum.pl」というファイルを作成して、以下の内容を記述してください。
SPVMで書かれた「MyMath」パッケージの「sum」サブルーチンを呼び出して、配列の和を計算します。
use FindBin; use lib "$FindBin::Bin/lib"; use SPVM 'MyMath'; my $sp_nums = SPVM::new_int_array([3, 6, 8, 9]); my $total = MyMath->sum($sp_nums); print $total . "\n";
まず最初にlibディレクトリをモジュールの検索パスに追加します。
# libディレクトリをモジュールの検索パスに追加 use FindBin; use lib "$FindBin::Bin/lib";
次にSPVMモジュールを読み込みます。
# SPVMモジュールを読み込み use SPVM 'MyMath';
「use SPVM 'SPVMモジュール名'」という記述で、SPVMモジュールを読み込むことができます。
次にSPVMの配列を作成します。
# int型配列の作成 my $sp_nums = SPVM::new_int_array([3, 6, 8, 9]);
SPVM::new_int_array関数を使うと、配列のリファレンスを渡して、SPVMのint型の配列を作成することができます。
MyMathパッケージのsumサブルーチンを呼び出してみましょう。
# MyMathパッケージのsumサブルーチンを呼び出し my $total = MyMath->sum($sp_nums);
SPVMのサブルーチン呼び出しは、Perlのクラスメソッドの呼び出しになることに注意してください。「絶対名 MyMath::sub」で呼び出すことはできません。
sum関数の戻り値は「int型」ですが、SPVMの整数型は、自動的にPerlのスカラ型に変換されます。