8: 2009-12-27 (日) 07:40:00 HOSINO[6] [7] | 9: 2009-12-27 (日) 12:55:23 HOSINO[6] [8] | ||
---|---|---|---|
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 ; | ||
Line 475: | Line 475: | ||
BGN DUP WHL words pointer @ + ! pointer @ 1 + pointer ! RPT 0 words pointer @ + ! 0 pointer ! | BGN DUP WHL words pointer @ + ! pointer @ 1 + pointer ! RPT 0 words 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というワードが実行されるとスタックからデータが一つ取り出され、~ | ||
~ | ~ | ||
~ | ~ | ||
Line 482: | Line 531: | ||
~ | ~ | ||
~ | ~ | ||
+ | ~ | ||
+ | ~ | ||
+ | ''工事中!''~ |
(This host) = http://osask.net