SPVMエクスチェンジAPI仕様 1.0 ベータ

# SPVMエクスチェンジAPI仕様 1.0ベータ

SPVMドキュメント > SPVMエクスチェンジAPI仕様

## SPVMエクスチェンジAPI仕様

SPVMエクスチェンジAPI仕様がこのドキュメントには記述されています。SPVMは、1.0のリリースに向けて、ベータテスト中です。SPVMエクスチェンジAPI仕様は、警告なく変更されることがあります。

最終更新日 2019年5月4日

## 目次

## SPVMエクスチェンジAPIとは

SPVMエクスチェンジAPIとは、PerlとSPVMのデータ構造を変換、PerlからSPVMのサブルーチンを呼び出すためのAPIのことです。

- Perlの数値や文字列や配列などのデータ構造をSPVMのデータ構造に変換
- SPVMのデータ構造をPerlの数値や文字列や配列などのデータ構造に変換
- SPVMのサブルーチンを呼び出す
- SPVMのサブルーチンを呼び出すためのPerlモジュールとの紐づけ

SPVMで作成されたモジュールは、コンパイル終了後に、Perlのモジュールとして、そのまま実行できるようになります。

## Perlのデータ構造をSPVMのデータ構造に変換する

### Perlのスカラ値をSPVMのSPVM::Byte型に変換 - SPVM::Byte->new

Perlのスカラ値をSPVMのSPVM::Byte型に変換するには、SPVM::Byte->newメソッドを使います。

    my $spvm_byte = SPVM::Byte->new(98);

Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのbyte型に変換され、その値が、SPVM::Byteのnewメソッドに渡され、SPVM::Byte型のオブジェクトが返されます。

    (int8_t)SvIV(sv_value)

### Perlのスカラ値をSPVMのSPVM::Short型に変換 - SPVM::Short->new

Perlのスカラ値をSPVMのSPVM::Short型に変換するには、SPVM::Short->newメソッドを使います。

    my $spvm_short = SPVM::Short->new(9800);

Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのshort型に変換され、その値が、SPVM::Shortのnewメソッドに渡され、SPVM::Short型のオブジェクトが返されます。

    (int16_t)SvIV(sv_value)

### Perlのスカラ値をSPVMのSPVM::Int型に変換 - SPVM::Int->new

Perlのスカラ値をSPVMのSPVM::Int型に変換するには、SPVM::Int->newメソッドを使います。

    my $spvm_int = SPVM::Int->new(100000);

Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのint型に変換され、その値が、SPVM::Intのnewメソッドに渡され、SPVM::Int型のオブジェクトが返されます。

    (int32_t)SvIV(sv_value)

### Perlのスカラ値をSPVMのSPVM::Long型に変換 - SPVM::Long->new

Perlのスカラ値をSPVMのSPVM::Long型に変換すると、SPVM::Long->newメソッドを使います。

    my $spvm_long = SPVM::Long->new(98);

Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのlong型に変換され、その値が、SPVM::Longのnewメソッドに渡され、SPVM::Long型のオブジェクトが返されます。

    (int64_t)SvIV(sv_value)

### Perlのスカラ値をSPVMのSPVM::Float型に変換 - SPVM::Float->new

Perlのスカラ値をSPVMのSPVM::Float型に変換するには、SPVM::Float->newメソッドを使います。

    my $spvm_float = SPVM::Float->new(2.5);

Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのfloat型に変換され、その値が、SPVM::Floatのnewメソッドに渡され、SPVM::Float型のオブジェクトが返されます。

    (float)SvNV(sv_value)

### Perlのスカラ値をSPVMのSPVM::Double型に変換 - SPVM::Double->new

Perlのスカラ値をSPVMのSPVM::Double型に変換するには、SPVM::Double->newメソッドを使います。

    my $spvm_double = SPVM::Double->new(2.5);

Perlのスカラ値は、perlapiとC99の型変換による以下の変換によって、SPVMのdouble型に変換され、その値が、SPVM::Doubleのnewメソッドに渡され、SPVM::Double型のオブジェクトが返されます。

    (double)SvNV(sv_value)

### Perlの配列リファレンスをSPVMのbyte[]型に変換 - SPVM::new_barray

Perlの配列リファレンスをSPVMのbyte[]型に変換するには、SPVM::new_barray関数を使います。

    my $spvm_nums = SPVM::new_barray([1, 2, 3]);

第一引数に配列のリファレンスを受け取ります。

配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのbyte型に変換されます。

    (int8_t)SvIV(sv_value)

戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの配列リファレンスをSPVMのshort[]型に変換

Perlの配列リファレンスをSPVMのshort[]型に変換するには、SPVM::new_sarray関数を使います。

    my $spvm_nums = SPVM::new_sarray([1, 2, 3]);

第一引数に配列のリファレンスを受け取ります。

配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのshort型に変換されます。

    (int16_t)SvIV(sv_value)

戻り値は、SPVMの「short[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの配列リファレンスをSPVMのint[]型に変換

Perlの配列リファレンスをSPVMのint[]型に変換するには、SPVM::new_iarray関数を使います。

    my $spvm_nums = SPVM::new_iarray([1, 2, 3]);

第一引数に配列のリファレンスを受け取ります。

配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのint型に変換されます。

    (int32_t)SvIV(sv_value)

戻り値は、SPVMの「int[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの配列リファレンスをSPVMのlong[]型に変換

Perlの配列リファレンスをSPVMのlong[]型に変換するには、SPVM::new_larray関数を使います。

    my $spvm_nums = SPVM::new_larray([1, 2, 3]);

第一引数に配列のリファレンスを受け取ります。

配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのlong型に変換されます。

    (int64_t)SvIV(sv_value)

戻り値は、SPVMの「long[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの配列リファレンスをSPVMのfloat[]型に変換

Perlの配列リファレンスをSPVMのfloat[]型に変換するには、SPVM::new_farray関数を使います。

    my $spvm_nums = SPVM::new_farray([1, 2, 3]);

第一引数に配列のリファレンスを受け取ります。

配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのfloat型に変換されます。

    (float)SvNV(sv_value)

戻り値は、SPVMの「float[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの配列リファレンスをSPVMのdouble[]型に変換

Perlの配列リファレンスをSPVMのdouble[]型に変換するには、SPVM::new_darray関数を使います。

    my $spvm_nums = SPVM::new_darray([1, 2, 3]);

第一引数に配列のリファレンスを受け取ります。

配列のリファレンスのそれぞれの要素の値は、Perlのスカラ値から、perlapiとC99の型変換による以下の変換によって、SPVMのdouble型に変換されます。

    (double)SvNV(sv_value)

戻り値は、SPVMの「double[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlのバイナリ列をSPVMのbyte[]型に変換 - SPVM::new_barray_from_bin

Perlのバイナリ列をSPVMのbyte[]型に変換するには、SPVM::new_barray_from_bin関数を使います。

    my $perl_binary = pack('c3', 97, 98, 99);
    my $spvm_byte_array = SPVM::new_barray_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ8bit符号付整数の並びと解釈されます。長さは、8bit符号付整数として解釈された場合の長さになります。

戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

上記のサンプルは、次と同じ意味でもあります。バイナリ列は、8bit符号付整数の並びである場合は、packを使っても、Perlのdecodeされていない文字列でもかまいません。

    my $binary = "abc";
    my $spvm_byte_array = SPVM::new_barray_from_bin($perl_binary);

### Perlのバイナリ列をSPVMのstring型に変換 - SPVM::new_str_from_bin

Perlのバイナリ列をSPVMのstring型に変換するには、SPVM::new_str_from_bin関数を使います。

    my $perl_binary = pack('c3', 97, 98, 99);
    my $spvm_byte_array = SPVM::new_str_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ8bit符号付整数の並びと解釈されます。長さは、8bit符号付整数として解釈された場合の長さになります。

戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。SPVMのstring型は実行時にはbyte[]型として扱われます。

第一引数が未定義値だった場合は、未定義値が返ります。

上記のサンプルは、次と同じ意味でもあります。バイナリ列は、8bit符号付整数の並びである場合は、packを使っても、Perlのdecodeされていない文字列でもかまいません。

    my $binary = "abc";
    my $spvm_byte_array = SPVM::new_barray_from_bin($perl_binary);

この関数は実際には、SPVM::new_barray_from_binのエイリアスです。

### Perlのバイナリ列をSPVMのshort[]型に変換 - SPVM::new_sarray_from_bin

Perlのバイナリ列をSPVMのshort[]型に変換するには、SPVM::new_sarray_from_bin関数を使います。

    my $perl_binary = pack('s3', 97, 98, 99);
    my $spvm_short_array = SPVM::new_sarray_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ16bit符号付整数の並びと解釈されます。長さは、16bit符号付整数として解釈された場合の長さになります。

戻り値は、SPVMの「short[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlのバイナリ列をSPVMのint[]型に変換 - SPVM::new_iarray_from_bin

Perlのバイナリ列をSPVMのint[]型に変換するには、SPVM::new_iarray_from_bin関数を使います。

    my $perl_binary = pack('l3', 97, 98, 99);
    my $spvm_int_array = SPVM::new_iarray_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ32bit符号付整数の並びと解釈されます。長さは、32bit符号付整数として解釈された場合の長さになります。

戻り値は、SPVMの「int[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlのバイナリ列をSPVMのlong[]型に変換 - SPVM::new_larray_from_bin

Perlのバイナリ列をSPVMのlong[]型に変換するには、SPVM::new_larray_from_bin関数を使います。

    my $perl_binary = pack('q3', 97, 98, 99);
    my $spvm_long_array = SPVM::new_larray_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ64bit符号付整数の並びと解釈されます。長さは、64bit符号付整数として解釈された場合の長さになります。

戻り値は、SPVMの「long[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlのバイナリ列をSPVMのfloat[]型に変換 - SPVM::new_farray_from_bin

Perlのバイナリ列をSPVMのfloat[]型に変換するには、SPVM::new_farray_from_bin関数を使います。

    my $perl_binary = pack('f3', 0.5, 1.5, 2.5);
    my $spvm_float_array = SPVM::new_farray_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ32bit浮動小数点の並びと解釈されます。長さは、32bit浮動小数点として解釈された場合の長さになります。

戻り値は、SPVMの「float[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlのバイナリ列をSPVMのdouble[]型に変換 - SPVM::new_darray_from_bin

Perlのバイナリ列をSPVMのdouble[]型に変換するには、SPVM::new_darray_from_bin関数を使います。

    my $perl_binary = pack('f3', 0.5, 1.5, 2.5);
    my $spvm_double_array = SPVM::new_darray_from_bin($perl_binary);

第一引数にPerlのバイナリ列を受け取ります。

バイナリ列は、実行環境のバイトオーダーで並んだ32bit浮動小数点の並びと解釈されます。長さは、32bit浮動小数点として解釈された場合の長さになります。

戻り値は、SPVMの「double[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの文字列をSPVMのbyte[]型に変換 - SPVM::new_barray_from_str

Perlの文字列をSPVMのbyte[]型に変換するには、SPVM::new_barray_from_str関数を使います。Perlの文字列は、ここではデコードされた文字列を指します。

    use utf8;
    my $spvm_byte_array = SPVM::new_barray_from_str("あいうえお");

第一引数にPerlの文字列を受け取ります。Perlの文字列は、ここではデコードされた文字列を指します。

長さは、UTF-8として、バイト列を数えた場合の長さになります。

戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。

第一引数が未定義値だった場合は、未定義値が返ります。

### Perlの文字列をSPVMのstring型に変換 - SPVM::new_str

Perlの文字列をSPVMのstring型に変換するには、SPVM::new_str関数を使います。Perlの文字列は、ここではデコードされた文字列を指します。

    use utf8;
    my $spvm_string = SPVM::new_str("あいうえお");

第一引数にPerlの文字列を受け取ります。

長さは、UTF-8として、バイト列を数えた場合の長さになります。

戻り値は、SPVMの「byte[]」型を表現した「SPVM::Data::Array」オブジェクトです。SPVMのstring型は実行時にはbyte[]型として扱われます。

第一引数が未定義値だった場合は、未定義値が返ります。

この関数は実際には、SPVM::new_barray_from_strのエイリアスです。

## ユーティリティ