extFactor for ver.
拡張辞書 extFactor は、
Factor
の if 文を Paraphrase でも実現するものです。
※参考実装ですが、ソースコードは src/dict/ext/extFactor.cpp にあります。
Factor における if 文は、Paraphrase とは異なり、以下のように記述されます。
[ true-part ] [ false-part ] if
少し補足説明をすると、Factor における大括弧 [ ] は、
Paraphrase で言うところの無名ワードブロックを構成するものであり、
Paraphrase 的に書くと、
{ true-part } { false-part } if
となります。
話を Factor に戻しましょう。 例えば、TOS が奇数のときには odd を、偶数の時には even と表示するコードを Factor で書く場合、以下のように記述できます。
2 mod 1 = [ "odd" ] [ "even" ] if .
この方法はワード if に即時実行属性を与えることなく、 条件判断を実装できるという特徴があります (が、この方法はプログラミングしづらいのでは?と判断したため Paraphrase では採用しませんでした)。
本拡張辞書は Factor 方式の if 文を実現する factor:if を提供します。 使用方法は以下の通りです(って、そのままですね…)。
{ true-part } { false-part } factor:if
実際の使用例については以下のワードリファレンスを参照して下さい。
factor:if
実行レベル | 標準実行レベル |
---|---|
スタックの変化 | B W W --- |
機能 | スタックの上から 3 番目の真偽値に応じて、 真ならばセカンドにある無名ワードを、 偽ならば TOS にある無名ワードを実行します。 |
使用例 |
TOS の値に応じて奇数ならば odd を、
偶数ならば even を表示するコードを以下に示します。
↓ Windows の場合は "ext/extFactor.dll"
|
エラー | スタック上に、 想定された値がプッシュされていないとエラーとなります。 |
ちなみに、factor:if と同じ動作をする factor-like-if は、 以下のように定義することもできます。
"factor-like-if" :
rot if
drop exec
else
swap drop exec
then
;
> true { "T" } { "F" } factor-like-if .
T ok.
> false { "T" } { "F" } factor-like-if .
F ok.
T ok.
> false { "T" } { "F" } factor-like-if .
F ok.