1000speakers用資料

プログラミング言語FIFOLの要素

オブジェクトの型は整数、ブール値、キュー、プロシージャがある。プロシージャは、{ } で囲まれたサブプログラム。

演算子はキューの操作、プログラムの制御および値出力に関する演算子と、算術論理演算および比較演算の演算子からなる。

演算子 before after 説明
pop [any ...] [...] ヘッドのオブジェクトをPOPする
dup [any ...] [... any any] ヘッドのオブジェクトをDuplicateしてテールに入れる
swp [any1 any2 ...] [... any2 any1] ヘッドの2オブジェクトの順番を入れ替えてテールに入れる
rot [any ...] [... any] ヘッドのオブジェクトをテールに入れる
newfifo [...] [... [ ] ] 新しく空のキューを作ってテールに入れる
fifopush [ [..] any ...] [... [.. any] ] ヘッドにあるキューに2番目のオブジェクトを入れて、キューをテールに入れる
fifopop [ [any ..] ...] [... [..] any] ヘッドにあるキューのヘッドのオブジェクトをPOPしてテールにキューとPOPしたオブジェクトを入れる
swi [ [..] ...] [ .. [...] ] ヘッドにあるキューと入れ替わる
if [bool proc ...] [...] ヘッドのオブジェクトが真なら2番目のプロシージャを実行する
ifelse [bool proc1 proc2 ...] [...] ヘッドのオブジェクトが真なら2番目、偽なら3番目のプロシージャを実行する
loop [proc ...] [...] ヘッドにあるプロシージャをループさせる
exit [...] [...] 今回っているループを抜ける
= [any ...] [...] ヘッドのオブジェクトを標準出力に出力する
? [...] [... any] 標準入力から呼んだものをテールに入れる
fifo [...] [...] 現在のキューの状態を標準出力に出力する

算術演算の演算子は、add}(加算)、sub(減算)、mul(乗算)、div(除算)、mod(剰余)、neg(符号反転)。論理演算の演算子は and(論理積)、or(論理和)、xor(排他的論理和)、not(論理否定)。整数が与えられた場合はビットごとの論理演算を行い、ブール値が与えられた場合は論理演算となる。
比較演算子はeq(等値)、ne(非等値)、ge(等値以上)、gt(より大きい)、le(等値以下)、lt(より小さい)。

FIFOLで書いた、「1〜10を出力するプログラム」

{ dup 10 rot ge { exit } rot if dup = 1 add } 1 loop

追記(おれ様拡張)

同じ演算が連続する場合は、演算子+繰り返し回数でも記述できる

rot rot rot rot
rot4