スタック注釈法
先に進む前に、誰かがあなたのプログラムを読むときのために、コマンドの前と後でスタックがどのように変化するのかを注釈するための、特別な記号法に慣れておくべきでしょう。そのフォーマットは次のようになります。:
( 前 -- 後 )
スタック上の値の配置が、演算の前と後の両方について示されています(開く括弧と初めの記号との間の空白に注意してください)。 実際の演算は、二つ続けたハイフン(--)で暗示されています。 そうすると、加法演算(+ 演算だけで、答えを表示したりMopsプロンプト【カーソル】を移動する余分な部分が無いもの)では、演算の前にはスタック上に二つの数値があり、演算の後にはスタック上にそれらの和である一つの数値を得て終わることになります。 つまり、スタック上の第一および第二の数で初めて、和をスタック上に得て終わるわけです。 スタック注釈は、次のようになります。:
( n1 n2 -- sum )
これが、したがって、加法演算の記述になります。
ドットコマンドの注釈は、:
( n -- )
です。 というのは、このコマンドは、スタックから一番上の値を取り除き、それをスクリーン上に表示するからです。 この処理過程で、値はスタックから取り除かれ、演算の後には、スタック上にその痕跡は残りません。
CRコマンドでは、スタック上の値には何も起りません。 単にプロンプトを次の行の左端に移動するだけです。 スタック操作は含まれていないのですから、CRコマンドの注釈は次のようになります。:
( -- )
あなたがプログラムで定義する全てのMopsワードの定義には、そのスタック注釈がつけられるべきです。 私達の規約は、それが ( -- ) である場合、そしてその場合に限り、スタック注釈は省略してもよい、というものです。
わたしたちが
Mops辞書にある全ワードのスタック作用をどのように記述してきたかについては、このマニュアルのクラスレファレンスのパートを精読してください。 この記号法は、初めは、Mopsワードがどのように働くかを学ぶための助けとなります。 しかし、もっと後になって、エディターでプログラムを書き始めたときにも、あなたを助けてくれることでしょう。 括弧内のワードや数字(開き括弧の後に少なくとも一つの空白をあけた)は、プログラムの中にコンパイルされることはありません。 ですから、最終的なプログラムのサイズに、1バイトも付け加えることはありません。 注釈は、プログラム開発中にあなたが混乱してしまったとき、 あなたのプログラムを辿るときの助けとなるために存在するのです。
要するに、スタック注釈は、あなたのプログラムにトキュメントをつけるための、手軽な近道なのです。
注意:括弧内にあるもの(つまり、一つ以上の空白文字が続く開き括弧で始まる部分)はMopsによって無視されるのですから、 Mopsウィンドウ上で定義するワードに、スタック注釈を打ち込む必要はありません。 スタック注釈は、ソースコードを読むための助けとしてのみ、あるものです。 このチュートリアルでは、あなたが定義するワードのスタック注釈を頻繁に示しています。 注釈は、あなたが定義をよりよく理解できるように助け、 あなたがエディターで自分自身のプログラムを書き始めた後 あなたの定義はどのように見えるべきであるかを示すために、存在しているのです。
算術演算子
四つの基本算術演算子のMopsスタックの記述は次のようになります。:
+ |
( n1 n2 -- sum ) |
‘n1’ と ‘n2’ を加算し、 和をスタックに残す。 |
- |
( n1 n2 -- diff ) |
‘n1’ から ‘n2’ を減算し、差をスタックに残す。 |
* |
( n1 n2 -- prod ) |
‘n1’ と ‘n2’ を乗算し、積をスタックに残す。 |
/ |
( n1 n2 -- quot ) |
‘n1’ を ‘n2’ で除算し、商をスタックに残す。 |
慣れない人にとっては、スタックの順番(数字が反対の順序で出てくるやり方)が、引き算や割り算では、 混乱するかもしれません。これらの演算では、数字の順序が大事だからです。 もし、10から4を引きたかったなら、減法演算がこれらに作用するための正しい順番で、数値がスタックから出てくるようにしなければなりません。 幸運なことに、Mopsは処理についての思考上の苦労をすべて取り除いてくれます。
おそらく学校で学んだであろう計算表記法では、問題は次のように表記されます:
10 - 4
そして求められる答え6を得ます。 Mopsでの計算では、スタック上に向う数値の順番は同じです。 演算記号を右に移動すればよいだけです。
この場合、問題は:
10 4 -
となります。
割り算でも同じです。 200 を 25で割るときの式は、
200 / 25
から
200 25 /
に変わります。
基本的な
四則演算は、整数上にしか利用できません。 つまり、-2, 0, 3, -453, あるいは 1002といった数の全体です。 小数点以下は勘定されません。 しかし、ガッカリすることはありません。 Mopsはあらゆる種類の数を扱うためのたくさんの方法を持っているのですから。 これは、もっと後で見ることにしましょう。
四則演算を用いて実験してみてください。 一つ、二つ、三つおよび四つの整数(あるいは、そうしたいなら、もっと多く)をスタックに置いて、 演算が、スタック上の数をどのように利用するのか理解してください。 それを試し終えたなら、割り算の問題の応えについて、特別に注意してみてください。
試してみれば、割り切れない数の割り算の場合を除けば、全て思った通りになるはずです。 例えば、10 を 3で割れば、Mopsの答えは3です。
10 3 / . CR
3
|
Mopsで割り算(/)を使った場合、余りは永久に失われてしまいます。 しかし、Mopsは、あなたのために余りを考慮してくれる、別の二つの演算をもっています。:
/MOD |
( n1 n2 -- rem quot ) |
‘n1’ を ‘n2’ で割り、余りと商をスタックに置く。 |
MOD |
( n1 n2 -- rem ) |
‘n1’ を ‘n2’ で割り、余りだけをスタックに置く。 |
また 10 を 3 で割ってみましょう。 ただし、今回は、単なる割り算(/)ではなく /MOD 演算を使ってみましょう。 (Mopsは大文字小文字は区別しないことに注意!)
10 3 /mod . . cr
3 1
|
今度は、商(3)と余り(1)の両方がスタックに返されていることに注意しましょう。 (そして、その後に二つのドットコマンドで数値をプリントしています) また、それらの二つの答えがスタックに出てくるときの順番と、それが上記の/MODのスタック注釈で記述された順番とどのように対応しているのかにも注意してください。スタック注釈の一番右に現れる値である商は、スタックの一番上にあります。それで、ディスプレイ上には最初にプリントされたのです。
負の数を含む割り算は、二つの異なる方法で実施することができます。 MopsではAppleのハードウェアで用いられている規約に従っています。 つまり、"0に近い方をとる"割り算です(symmetric division【対称除法?】とも、よく言われます)。 商が正確に整数ではないときには、割り算が与える商は、それから0に近い側の整数になるということです。 例えば、 -10を7で割ると、商-1、余り-3が得られます。 (余りは、0でなければ、いつも最初の演算項、つまり割られる数と同じ符号になるでしょう。)
演算後置記法を習得する
もしも、あなたがこの演算後置記法(postfix notation)と呼ばれる逆転記法(逆ポーランド記法(reverse Polish notation)としても知られています)に特別によく習熟しているのでなければ、 複合的な数式は、それをMopsの演算後置型の整数演算環境に入力する前に、分析が必要になるということを知っておくことは、重要なことです。 例えば、次の式をMopsプログラムに含めなければならなくなる、ということもあるでしょう。
1.25 * 12 * 50
----------------
10
そのような場合は、Mopsの整数演算法が障壁のように思われ、その演算後置記法は無益なものと思われるかもしれません。 しかし、全てを整数に変換する簡単な代数を思い出して、複合的な式を、あなたが紙と鉛筆でそれを解くときの段階に分解してみてください。
Mopsで上の式と等価なものは、次のようになります:
5 12 50 * * 40 /
このような複合的な式の間にスタック上で何が起るかを追跡するのは有意義なことです。 ます第一に、 1.25を整数化するために、この数と分母(10)を4倍します。 それから、三つの数を全部スタック上でかけ算します。 最初の乗法演算はスタックの上の二つをかけ算し(50 かける12)、 その結果(600)をスタックに残します。 この演算は、スタックの一番上に600を残し、ちょうどその下は5になります。 二番目の乗法演算はスタックに残った二つの数をかけ算し(600かける5)、 結果(3000)をスタック上に残します。 この結果が、割られる数(分子)として割り算が起るのを待ちます。 さて、割る数(分母)40をスタックの一番上におくべきときです。 かくして、最後の演算である除法が二つの数の割り算をスタックにおいて行います。
これらスタックに関する事柄で、げんなりする必要はありません! レッスン10では、Mopsは二つの強力なツールを提供してくれていることを学ぶでしょう。 名前付き入力引数と 局所変数です。 これらによって、スタック上の値の代わりに容易に特定できる名前を使い、好きなときにその値を利用できるようになります。 このとき、スタックは、ほとんど見えなくなるでしょう。 しかし、それでもなお、スタックの基本を理解するのは重要なことです。 【局所変数等には、利用可能な個数に制限があります。このことは、Mopsにおいてもやはりスタックが基本であり、局所変数は補助手段であるということを示していると言えます。】
最終更新:2018年12月04日 00:41