7: 2009-12-27 (日) 07:36:44 HOSINO[6] [7] | 現: 2024-01-08 (月) 12:58:43 lina[8] [9] | ||
---|---|---|---|
Line 465: | Line 465: | ||
いきなりですが、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] | ||
~ | ~ | ||
~ | ~ | ||
~ | ~ | ||
~ | ~ | ||
+ | ''工事中!''~ |
(This host) = http://osask.net