連鎖性言語を作る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のメソッドを呼び出す機能にチャレンジする。
続きを読む