Doge log

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

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

2クール目きましたね。
今回は制御文。というか制御系word。

Factorでの制御文

Factorの制御構文は全てwordです。
多くの制御構文はquotを引数に取り、評価時に実行します。
Factorの制御文で気にしなくてはならない事は逆ポーランド法である事です。
if wordが式の最後にくるので少しわかりにくくなっています。

t
[ "true" write ]
[ "false" write ]
if

if if*

ifはcond、true時に実行するquot、false時に実行するquotを取ります。
condが返す結果によって実行するquotを切り替えます。

empty?
[ "empty" write ]
[ "not empty" write ]
if

empty?がtrueの時には"empty"、falseの場合は"not empty"と表示されます。
if*はifの亜種です。
true時にstackにtrueが積まれた状態でquotを実行します。
if*は以下のように書きかえる事ができます。

X [ Y ] [ Z ] if*
X dup [ Y ] [ drop Z ] if

when when*

whenはcond、trueの時に実行するquotを取ります。
ifのfalseがないものと思ってもらってかまいません。

empty? [ "empty" write ] when

when*はwhenの亜種です。
if*と同様、trueをstackに積んでからquot実行します。

unless unless*

unlessはwhenの逆です。
false時にquotを実行します。

empty? [ "not empty" write ] unless

unless*も同様です。

?

?はifの内部実装ともいえます。
?はbool、true時返すobject、false時返すobjectを指定します。
ifは?を使って以下のように書きなおす事ができます。

empty? [ "empty" write ] [ "not empty" write ] ? call

その他のword

制御系wordの多くは条件として引数にboolを取ります。
場合により複雑な条件を取ることもあるでしょう。
それらをサポートするために以下のwordが用意されています。
それらを簡単に紹介します。

  1. >boolean ( obj -- ? ) objをtrue or falseに変換します
  2. not ( obj -- ? ) objがfであればtrueを返します
  3. and ( obj1 obj2 -- ? ) 両方のobjがtrueであればtrueを返します
  4. or ( obj1 obj2 -- ? ) 片方がtrueであればtrueを返します
  5. xor ( obj1 obj2 -- ? ) 論理積を返します

とりあえずざっくりと説明しました。
次回は関数合成(基本)をやります。