連鎖性言語を作る6

リテインスタックを作ろう。これは通常のデータスタックとは別のスタックで、一時保存用のものとなる。作るのは非常に簡単で、VMインスタンス変数を追加して、データスタックとのやりとりをする>r、r>を追加する。

    @retain_stack = []
      :">r" => ->{@retain_stack << @stack.pop},
      :"r>" => ->{@stack << @retain_stack.pop},
[ 1 ] [ 1 2 >r ] unit-test
[ 1 2 ] [ 1 2 >r >r r> r> ] unit-test

うん、簡単だった。これを使うとrotなどのワードがオレ言語で定義できるようになる。

: rot ( x1 x2 x3 -- x2 x3 x1 ) >r swap r> swap ;
: -rot ( x1 x2 x3 -- x3 x1 x2 ) swap >r swap r> ;

rot系はスタックに積んだデータが3つになった時に重宝する。ついでにまだ作ってなかった基本的なワードをオレ言語で実装しておく。

: nip ( x1 x2 -- x2 ) swap drop ;
: tuck ( x1 x2 -- x2 x1 x2 ) swap over ;
: 2dup ( x1 x2 -- x1 x2 x1 x2 ) over over ;
: 2drop ( x1 x2 -- ) drop drop ;
: 2swap ( x1 x2 x3 x4 -- x3 x4 x1 x2 ) >r -rot r> -rot ;
: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) >r >r 2dup r> -rot r> -rot ;

ということで今回はRubyのメソッドを呼び出す機能にチャレンジする。

続きを読む