Next: , Previous: , Up: Forth Tutorial   [Contents][Index]


3.19 Counted loops

: ^ ( n1 u -- n )
\ n = the uth power of n1
  1 swap 0 u+do
    over *
  loop
  nip ;
3 2 ^ .
4 3 ^ .

U+do (あなたの Forth システムにない場合は compat/loops.fs をインクルードしてください)は、 ( u3 u4 -- ) 、 つまり、 スタックから 2 つの数値を取得し、 u+doloop の間のコードを u3 - u4 回実行します( u3 - u4 < 0 の場合はまったく実行しません)。

ループ開始ワードのスタック効果を見れば、スタック効果の設計ルールが機能していることがわかります。 ループの開始値は終了値と比べて定数であることが多いため、 開始値はスタック頂上(top-of-stack)に渡されます。

i を使用して、 ループ・カウンターにアクセスできます:

: fac ( u -- u! )
  1 swap 1+ 1 u+do
    i *
  loop ;
5 fac .
7 fac .

+do もあります。 これは符号付きの数値を期待します(それはループに入るかどうかを決定するために重要です)。

研究課題(assignment): n 番目のフィボナッチ数を計算するための定義を記述してみましょう。

増分として 1 以外も使用できます:

: up2 ( n1 n2 -- )
  +do
    i .
  2 +loop ;
10 0 up2

: down2 ( n1 n2 -- )
  -do
    i .
  2 -loop ;
0 10 down2

こちらも参照ください: Counted Loops