/func {1 exch -1 1 {mul} for} defようするに、自分がしたい操作に必要な変数が、適切な数だけ適切な順番でスタックに積まれているようにすればいいらしい。そしてスタックというやつからは、直前に積んだものだけを取り出すことができる。
たとえば上記で定義した階乗のオペランド func を以下のように呼び出すと、
GS> 5 funcまず 5 がスタックに積まれる。この 5 は「funcへの引数」のつもりなんだけど、スタックから見るとそんなつもりはなくて、ただ値が積まれただけ。次は func を積むんだけど、func は上記のように定義されているので、その定義の一番最初にある 1 がスタックに積まれる。この時点のスタックの状態はこんな感じ。
1func の定義によれば、次は exch だ。これは、それまでスタックの1番上にあった要素とその下の要素を入れ替える。つまり、スタックの状態はこうなる。
---
5
5さらに -1 と 1 を順番に積んで、スタックの状態はこうなる。
---
1
1ここで、本文が mul だけの for が登場する。for というオペレータは、スタックの値を 3つ消費し、それぞれの値を深いほうから順番に「繰り返しの最初」「繰り返しの更新」「繰り返しの終わり」として本文を繰り返す。ただし毎回の繰り返しでは、スタックの先頭に、そのターンにおける変数のようなものが積まれる。こう書くと複雑だけど、ようは最初に本文を実行するときには「5」が、2回目は「4」が、...、5回目は「1」がスタックの先頭に積まれるということ。つまり1回目の繰り返しのとき、スタックの状態はこう。
---
-1
---
5
---
1
5本文の mul は、このスタックから値を 2つ取り出して、それらの積をあらためてスタックに積む。したがってスタックの状態は、
---
1
52回目の繰り返しに際してスタックの先頭に「4」が積まれる。
4このスタックで mul を適用すると、
---
5
203回目の繰り返しに際してスタックの先頭に「3」が積まれる。
3mul を適用して
---
20
604回目の繰り返しに際してスタックの先頭に「2」が積まれる。
2mul を適用して
---
60
1205回目の繰り返しに際してスタックの先頭に「1」が積まれる。
1mul を適用して
---
120
120おしまい。こうして最後のスタックの値を取り出せば(そのためには == を使う)、5の階乗の値が得られる。
たぶん用語の使い方はいいかげん。はやく教科書こないかな。
0 件のコメント:
コメントを投稿