サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  
7: 2009-12-27 (日) 07:36:44 HOSINO ソース 現: 2024-01-08 (月) 12:58:43 lina ソース
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]
~ ~
~ ~
~ ~
~ ~
 +''工事中!''~

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。