アホが書き散らす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*は以下のように書きかえる事ができます。
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が用意されています。
それらを簡単に紹介します。
- >boolean ( obj -- ? ) objをtrue or falseに変換します
- not ( obj -- ? ) objがfであればtrueを返します
- and ( obj1 obj2 -- ? ) 両方のobjがtrueであればtrueを返します
- or ( obj1 obj2 -- ? ) 片方がtrueであればtrueを返します
- xor ( obj1 obj2 -- ? ) 論理積を返します
とりあえずざっくりと説明しました。
次回は関数合成(基本)をやります。