Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

アホが書き散らすFactor入門 その5

今回はShuffle words。
スタック操作です。

Shuffle words

Shuffle wordsはスタックを操作するためのwordです。
スタック上のデータの削除、コピー、順序を入れ替えたりします。
これらのwordはpremitiveでVM自身が持っている低レベルの操作を行うwordです。
(vocabulary kernelに所属しているword)

例えば

: sq dup * ;

2乗を求めるword sqですが、引数の値をコピーする事によって2乗を計算しています。

これらのwordsの動作は非常にシンプルです。
ですが、スタック指向のプログラム言語ではとても重要な役割をしています。
では簡単にスタックを操作するwordを見てみます。

remove系

スタックから取り出すwordです。

  1. drop ( x -- )
  2. 2drop ( x y -- )
  3. 3drop ( x y z -- )
  4. nip ( x y -- y )
  5. 2nip ( x y z -- z )

stack effectを見れば何をやるか一目瞭然なので細かい説明は省略します。

duplicate系

スタック上のデータをcopyするwordです。

  1. dup ( x -- x x )
  2. 2dup ( x y -- x y x y )
  3. 3dup ( x y x -- x y z x y z)
  4. dupd ( x y -- x x y )
  5. over ( x y -- x y x )
  6. pick ( x y z -- x y z x )
  7. tuck ( x y -- y x y )

これも一目瞭然なの割愛。

permuting系(順序変更)

スタック上のデータの順序を入れ替えるwordです。

  1. swap ( x y -- y x )
  2. swapd ( x y z -- y x z )
  3. rot ( x y z -- y z x )
  4. -rot ( x y z -- z x y )
  5. roll ( x y z t -- y z t x )
  6. -roll ( x y z t -- t x y z )

これも一目瞭然なの割愛。

保持するための予備stack(retain stack)

Factorには一時的にobjectを保持しておくための別のスタックがいます。
retain stackです。

  1. >r ( x -- ) retain stackに値を積みます
  2. r> ( -- x ) retain stackから値を取り出します

retain stackはword内のlocal storageです。
word内で状態を持つことができます。
簡単な例です

: foo ( ? -- y )
[ >r ] [ r> ] if ;

10 foo
f foo .
10

ここではif wordを使っています。
ifなのでtrue、falseを受けてどちらかのquotを実行します。
この場合、最初の

10 foo

ではifにtrue(10)が渡たされるので値をretain stackに積みます。
その次

f foo .

ではifがfalseになるのでretain stackから値を取り出しています。
foo wordの2回目の実行では前回積んだ値が出力されます。
このように>r、r>を使うと状態を持つ事ができます。

とりあえずざっくりと説明しました。

連鎖性言語(スタック指向)は最短距離を求めるパズルのようなものです。
無駄な変数宣言なんてクソコードを書かせてくれないのがいいです。

ツンデレ言語Factorシリーズ次回は「word再び」をやる予定です。
この調子でいくとstream、class、curry、継続、スレッドにいくまで相当時間かかりそうだなあ。