7: 2009-12-27 (日) 07:36:44 HOSINO |
現: 2024-01-08 (月) 12:58:43 lina |
| いきなりですが、easy Forthを使って計算をさせて見たいと思います。~ | | いきなりですが、easy Forthを使って計算をさせて見たいと思います。~ |
| : main | | : main |
- | 0 "11 + 3 =" print 11 3 + . "\n" PUT | + | 0 "11 + 3 = " print 11 3 + . "\n" PUT |
- | 0 "11 - 3 =" print 11 3 - . "\n" PUT | + | 0 "11 - 3 = " print 11 3 - . "\n" PUT |
- | 0 "11 * 3 =" print 11 3 * . "\n" PUT | + | 0 "11 * 3 = " print 11 3 * . "\n" PUT |
- | 0 "11 / 3 =" print 11 3 / . "\n" PUT | + | 0 "11 / 3 = " print 11 3 / . "\n" PUT |
- | 0 "11 % 3 =" print 11 3 % . "\n" PUT | + | 0 "11 % 3 = " print 11 3 % . "\n" PUT |
| ; | | ; |
| : print invert BGN DUP WHL PUT RPT DRP ; | | : print invert BGN DUP WHL PUT RPT DRP ; |
- | : invert VAR pointer VAR256 words 0 pointer ! 256 BGN DUP WHL 0 DUP 1 - words ! RPT DRP | + | : invert VAR pointer VAR256 words 0 pointer ! 256 BGN DUP WHL 1 - DUP words + 0 SWP ! RPT DRP |
- | BGN DUP WHL words pointer @ + ! pointer @ 1 + pointer ! RPT 0 words pointer @ + ! | + | BGN DUP WHL words pointer @ + ! pointer @ 1 + pointer ! RPT 0 words pointer @ + ! 0 pointer ! |
- | 0 pointer ! BGN words pointer @ + @ WHL words pointer @ + @ pointer @ 1 + pointer ! RPT ; | + | BGN words pointer @ + @ WHL words pointer @ + @ pointer @ 1 + pointer ! RPT ; |
- | ''工事中!''~ | + | これを実行すると、11+3、11-3、11*3、11/3、11%3の結果がそれぞれ表示されます。~ |
- | ~ | + | (*は掛け算、/は小数点以下切り捨ての割り算、%は割り算の余り)~ |
- | ~ | + | まず、0 "11 + 3 = " printのところは前回までの内容なのでいいと思います。~ |
| + | invertの中身は今回も説明しません。もう少し待って下さい。~ |
| + | 2~6行目の最後の"\n" PUTはちょっと変に思われた方もいるかもしれません。~ |
| + | \nというのは改行を表す特別な文字で、この二文字で一文字として扱われます。~ |
| + | そのため、PUT一回で出力することが出来、これが出力されると改行されます。~ |
| + | さて、最後に残ったprintと"\n"の間の説明です。~ |
| + | 代表して、2行目で説明します。~ |
| + | まず、11というワードが実行され、スタックに11が積まれます。~ |
| + | 次に、3というワードが実行され、スタックに3が積まれます。~ |
| + | そして、+というワードでは、スタックから二つデータを取り出し、その二つを足して答えをスタックに積みます。~ |
| + | これで、11+3の答えである14がスタックに積まれるわけです。~ |
| + | 最後に、.というワードは、スタックから一つデータを取り出し、それを数値として出力します。~ |
| + | ここでは、14が出力されます。~ |
| + | 3~6行もほぼ同じです。割る方、割られる方、引く方、引かれる方に注意してください。~ |
| + | スタックの一番上のデータで(を)、二番目のデータを(から)割る(引く)します。~ |
| + | ***if文を使う! [#ac5b9d2b] |
| + | easy Forthでは、勿論if文も使う事が出来ます。~ |
| + | 以下にサンプルを示します。~ |
| + | : main |
| + | 100 RND DUP . 0 " + " print 100 RND DUP . 0 " = " print + , "\n" PUT |
| + | = IF 0 "That's true !" print ELS 0 "That's false !" print THN |
| + | ; |
| + | : print invert BGN DUP WHL PUT RPT DRP ; |
| + | : invert VAR pointer VAR256 words 0 pointer ! 256 BGN DUP WHL 1 - DUP words + 0 SWP ! RPT DRP |
| + | BGN DUP WHL words pointer @ + ! pointer @ 1 + pointer ! RPT 0 words pointer @ + ! 0 pointer ! |
| + | BGN words pointer @ + @ WHL words pointer @ + @ pointer @ 1 + pointer ! RPT ; |
| + | これを実行すると、足し算の問題が出題されます。~ |
| + | これに、正しい答えを入力してEnterを押すとThat's true !と、間違った答えを入力してEnterを押すとThat's false !と表示されます。~ |
| + | では、プログラムを見ていきます。~ |
| + | 2行目にRNDというワードが二回出ています。~ |
| + | このワードは、スタックから一つデータを取り出し、0~取り出したデータ-1までの数で、ランダムに一つ選んでスタックに積みます。~ |
| + | 今回はどちらも100が直前に積まれているので、0~99の間で、ランダムに数が積まれます。~ |
| + | (ちなみに、このランダムな数の事を乱数と言います。)~ |
| + | それらの数はそれぞれDUPで複製され、片方は.でそれぞれ出力されています。~ |
| + | " = "が出力された後、二つの乱数は足されています。~ |
| + | そして、,というワードがきます。~ |
| + | このワードは、このプログラムを実行している人に数字を入力してもらうワードです。~ |
| + | Enterで入力を終了します。~ |
| + | 数字以外はもちろん入力できず、入力された物は数字として処理されます。~ |
| + | 今回はこのワードで、それまでに表示した足し算の式の答えを入力してもらいます。~ |
| + | 2行目が終わった時点で、スタックの中には、一番上に入力してもらった数値が、二番目に足し算の答えが入っています。~ |
| + | 3行目では、いきなり=というワードが実行されます。~ |
| + | このワードはスタックから値を二つ取り出し、その二つの値が等しければ1を、等しくなければ0をスタックに積みます。~ |
| + | ここでは、足し算の答えと入力された答えが同じなら1が、違えば0がスタックに積まれます。~ |
| + | そしてついにIFです。~ |
| + | easy Forthでは、IFというワードは以下のように使います。~ |
| + | IF ワード列(1) ELS ワード列(2) THN |
| + | IFというワードが実行されるとスタックからデータが一つ取り出され、その値が0以外ならワード列(1)を、0ならワード列(2)を実行します。~ |
| + | もし、値が0の時何もしないのであれば、~ |
| + | IF ワード列(1) THN |
| + | とすることもできます。~ |
| + | 今回は、答えが正解ならワード列(1)が、不正解ならワード列(2)が実行されます。~ |
| + | 最後に、=と似たような意味を持つワード群を書いておきます。~ |
| + | = スタックの1番目のデータが2番目のデータと等しければ1を、そうでなければ0をスタックに積みます |
| + | < スタックの1番目のデータが2番目のデータより小さければ1を、そうでなければ0をスタックに積みます |
| + | > スタックの1番目のデータが2番目のデータより大きければ1を、そうでなければ0をスタックに積みます |
| + | <= スタックの1番目のデータが2番目のデータより小さいか等しければ1を、そうでなければ0をスタックに積みます |
| + | >= スタックの1番目のデータが2番目のデータより大きいか等しければ1を、そうでなければ0をスタックに積みます |
| + | <> スタックの1番目のデータが2番目のデータと等しくなければ1を、そうでなければ0をスタックに積みます |
| + | ***変数を使う! [#u26830eb] |
| ~ | | ~ |
| ~ | | ~ |
| ~ | | ~ |
| ~ | | ~ |
| + | ''工事中!''~ |