<html>
  <head>
    <title>SPVMチュートリアル</title>
    <meta charset="UTF-8">
    <link rel="shortcut icon" href="/images/spvm-logo.png">
    <link rel="stylesheet" type="text/css" href="/css/common.css">
    <script type="text/javascript" src="/js/jquery-1.9.0.min.js"></script>
    <script type="text/javascript" src="/js/google-code-prettify/prettify.js"></script>
    <link  type="text/css" rel="stylesheet" href="/js/google-code-prettify/prettify.css"/>
    <script>
      $(function(){
        // google code prettifyの有効化
        $("pre").addClass("prettyprint");
        function init(event){
          prettyPrint();
        }
        if(window.addEventListener)window.addEventListener("load",init,false);
        else if(window.attachEvent)window.attachEvent("onload",init);
        
        $(".to-top").click(function() {
          // ページの一番上までスクロールさせます。
          $('body, html').animate({scrollTop: 0}, 300, 'linear');;
        });
      });
    </script>
  </head>
  <body>
    <div class="header">
      <div class="container">
        <h1>
          <a style="color:#333;text-decoration:none;" href="/"><img src="/images/spvm-logo.png">SPVMドキュメント 1.0 ベータ</a>
        </h1>
      </div>
    </div>
    
    <div class="container">
      <div>
        最終更新日 2019年7月16日
        <br><b>現在この日本語の翻訳ドキュメントは、SPVMの最新のドキュメントに追随していません。</b>
        <br>最新のドキュメントは<a href="https://yuki-kimoto.github.io/spvmdoc-public/">SPVM Document</a>を参照してください。
        <br>SPVMは1.0のリリースに向けて、活発に試験と開発が行われています。
      </div>

      <h2 id="tutorial">SPVMのチュートリアル</h2>
      <ul class="toc">
        <li><a href="#tutorial-install">SPVMのインストール</a></li>
        <li><a href="#tutorial-sum-array">配列の和を求める</a></li>
      </ul>

      <h3 id="tutorial-install">SPVMのインストール</h3>

      <p>
        SPVMはCPANモジュールです。cpanまたはcpanmを使ってインストールできます。
      </p>
<pre>
cpan SPVM
cpanm SPVM
</pre>

      <p>
        SPVMのチュートリアルです。
      </p>
      
      <h3 id="tutorial-sum-array">
        配列の和を求める
      </h3>
      
      <p>
        最初の簡単な例として配列の和を求めてみましょう。
      </p>
      <h4>SPVMモジュールの作成</h4>
      <p>
        「MyMath.spvm」というファイルファイルをlibディレクトリの中に作成してください。<b>SPVMのソースファイルの拡張子は「.spvm」</b>です。以下の内容を記述しましょう。
      </p>
<pre>
# 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;
  }
}
</pre>
      
      <p>
        SPVMでは<b>パッケージ構文</b>を使用して、パッケージを作成します。Perlのパッケージブロック構文と同じ文法です。
      </p>
<pre>
# パッケージ構文
package MyMath {

}
</pre>
      <p>
        パッケージのブロックの中では<b>サブルーチンの定義</b>を行うことができます。
      </p>
<pre>
package MyMath {
  sub sum : int ($nums : int[]) {
    
  }
}
</pre>
      
      <p>
        SPVMは静的型言語ですので、<b>サブルーチンの宣言の中で、戻り値の型、引数名と引数の型を記述</b>します。
      </p>
      <p>
        戻り値は「int型」。引数は「int型の配列」です。<b>int型は、32bit符号付整数</b>を表現します。
      </p>
      <p>
        配列の和を計算している部分をみてみましょう。
      </p>
<pre>
    my $total = 0;
    for (my $i = 0; $i < @$nums; $i++) {
      $total += $nums->[$i];
    }

    return $total;
</pre>
      <p>
        和の計算方法の見た目は、Perlでfor文を使って書いたものとまったく同じです。
      </p>
      <p>
        このようにSPVMではM<b>Perlと同じ文法で記述</b>できるのがひとつの特徴です。Perlユーザーが、新しい文法を覚える負担ができるだけ小さくなるように設計されています。
      </p>
      <p>
        変数の宣言では<b>型推論</b>を使って、型を省略することができます。
      </p>
<pre>
    my $total = 0;
</pre>
      <p>
        SPVMの型推論は、右辺の型が確定しているときに、左辺の型宣言を省略することができます。
      </p>
      <p>
        数値リテラルの「0」は「int型」ですので、「$total」の型も「int型」になります。以下の記述と同じ意味になります。
      </p>
<pre>
    my $total : int = 0;
</pre>
      <p>
        <b>配列の長さ</b>は「@」を使うことで取得できます。
      </p>
<pre>
@$nums
</pre>
      <p>
        SPVMには、コンテキストはなく「@」は常に配列の長さを返します。
      </p>
      <p>
        次にSPVMで書かれたサブルーチンをPerlの側から呼び出してみましょう。
      <p>
      <h4>SPVMモジュールの呼び出し</h4>
      <p>
        「sum.pl」というファイルを作成して、以下の内容を記述してください。
      </p>
      <p>
        SPVMで書かれた「MyMath」パッケージの「sum」サブルーチンを呼び出して、配列の和を計算します。
      </p>
<pre>
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";
</pre>
      <p>
        まず最初に<b>libディレクトリをモジュールの検索パスに追加</b>します。
      </p>
<pre>
# libディレクトリをモジュールの検索パスに追加
use FindBin;
use lib "$FindBin::Bin/lib";
</pre>
      <p>
        次に<b>SPVMモジュールを読み込み</b>ます。
      </p>
<pre>
# SPVMモジュールを読み込み
use SPVM 'MyMath';
</pre>
      <p>
        「use SPVM 'SPVMモジュール名'」という記述で、SPVMモジュールを読み込むことができます。
      </p>
      <p>
        次に<b>SPVMの配列を作成</b>します。
      </p>
<pre>
# int型配列の作成
my $sp_nums = SPVM::new_int_array([3, 6, 8, 9]);
</pre>
      <p>
        <b>SPVM::new_int_array関数</b>を使うと、配列のリファレンスを渡して、SPVMのint型の配列を作成することができます。
      </p>
      <p>
        <b>MyMathパッケージのsumサブルーチンを呼び出し</b>てみましょう。
      </p>
<pre>
# MyMathパッケージのsumサブルーチンを呼び出し
my $total = MyMath->sum($sp_nums);
</pre>
      <p>
        <b>SPVMのサブルーチン呼び出しは、Perlのクラスメソッドの呼び出しになることに注意してください。</b>「絶対名 MyMath::sub」で呼び出すことはできません。
      </p>
      
      <p>
        sum関数の戻り値は「int型」ですが、SPVMの整数型は、自動的にPerlのスカラ型に変換されます。
      </p>
      
    </div>
    <div class="footer">
      <div><a href="javascript:void(0)" class="to-top">▲</a></div>
      <a href="https://github.com/yuki-kimoto/SPVM">SPVMプロジェクト</a>
    </div>
  </body>
</html>