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"
> "ext/extFactor.so" import
  ok.
> 120 ← チェックする値として 120 をプッシュ
  ok.
> 2 % 1 == { "odd" } { "even" } factor:if .
  even ok.
エラー スタック上に、 想定された値がプッシュされていないとエラーとなります。

ちなみに、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.