呼び出す定義の名前を記述するだけで定義を呼び出すことができます。 通常、 定義はそれ自身の定義中は表示されません。 直接再帰的な定義を記述したい場合は、
recursive を使用して現在の定義を見えるようにする(使えるようにする)か、 recurse
を使用して現在の定義を直接呼び出すことができます。
recursive ( compilation – ; run-time – ) gforth-0.2 “recursive”
現在の定義中の定義をその定義内で呼び出せるように(表示できるように)し、 それ自体を再帰的に呼び出せるようにします。
recurse ( ... – ... ) core “recurse”
現在の定義の別名(alias)。
これらのワードの使用例については See Recursion を参照してください。
プログラミング・スタイル・メモ:
著者は、recurse よりも recursive を使用することを好みます。
名前で定義を呼び出す方が、 やや難解な recurse よりも説明的であるためです(名前が適切に選択されていれば)。
たとえば、クイックソートの実装では、「今、再帰呼び出しを行う」(now do a recursive
call)と読むよりも、「今、パーティションをソートする」(now sort the
partitions)と読む(そして考える)方がはるかに優れています。
相互再帰(mutual recursion)の場合は、 以下のように defer ワードを使用します:
Defer foo : bar ( ... -- ... ) ... foo ... ; :noname ( ... -- ... ) ... bar ... ; IS foo
defer された ワードについては、 Deferred Words で詳しく説明します。
定義の終わりに達するか、 EXIT に遭遇すると、 現在の定義は呼び出し元の定義に制御を返します。
EXIT ( compilation – ; run-time nest-sys – ) core “EXIT”
呼び出し元の定義に戻る(return): 通常、 定義から速やかに戻るのを強制する方法として使用されます。 EXIT する前に、
リターン・スタックをクリーンアップし、 未処理の ?DO...LOOP を UNLOOP する必要があります。
ローカル変数(local)が無い場合に exit のように動作するティック可能なワード(tickable word)には
;s を使用します。
?EXIT ( – ) gforth-0.2 “?EXIT”
f が true の場合、 呼び出し元の定義に戻ります(return)。
;s ( R:w – ) gforth-0.2 “semis”
EXIT によってコンパイルされたプリミティブ。