[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bfree-prj 42] Re: Extension to Mitten (FORTH Modoki)
- To: bfree-prj@iijnet.or.jp
- Subject: [bfree-prj 42] Re: Extension to Mitten (FORTH Modoki)
- From: Tomohide Naniwa <naniwa@mechgw.mech.yamaguchi-u.ac.jp>
- Date: Mon, 22 Feb 1999 17:44:52 +0900 (JST)
- Cc: bfree-kernel@tron-net.gr.jp
- In-Reply-To: Your message of "Sun, 21 Feb 1999 23:38:11 +0900".<36D01A53A.649EMITSU.TAKADA@smtp.nifty.ne.jp>
- Reply-To: bfree-prj@iijnet.or.jp
- Sender: owner-bfree-prj@iijnet.or.jp
浪花です.
In "[bfree-prj 41] Re: Extension to Mitten (FORTH Modoki)",
Sun, 21 Feb 1999 23:38:11 JST
mitsu.takada@nifty.ne.jp writes:
> 高田です。
> B-Free ML とKernel MLに送っています。
Kernel ML への Cc: も残してあります.
> B-Freeからソースのリンクと、ドキュメントを載せたいのですがよろしいでしょ
> うか?
公開後にも幾つかバグを見つけて修正しました.現在アーカイブのバージョ
ンを 1.1.2 としております.更新したドキュメントを最後に添付します
のでそちらをご利用ください.また,リンク先は
http://scserv.mech.yamaguchi-u.ac.jp/~naniwa/comp/bfree/
にして頂けると,更新履歴のページも表示されて良いかも知れません.
# index.html を置いていないのでディレクトリ・ツリーが出ますが.
## 実は 3 月半ばに Web サーバーの移動の予定もあります.
利用して頂けるようなら Kernel のソースにマージして頂いても良いので
すが,Mitten にユーザーオペレータの処理が追加されれば frtm は不要
になるでしょうし,どういうスタンスを取れば良いのか迷っている部分も
あります.
以下,ドキュメントです.
-------------
FoRTh Modoki for B-Free
ver 1.1.2 Feb. 22, 1999. by 浪花 智英 (naniwa@mechgw.mech.yamaguchi-u.ac.jp)
0. B-Free でのコンパイル
手順
1. kernel/BTRON/init/libMitten の下に *.c, *.h, frtm.patch をコピーす
るかシンボリック・リンクをはってください.
2. patch < frtm.patch として Makefile と commands.inc にパッチをあてます.
3. 普通に btron を作成してください.
4. frtm の起動は init> が出ているところで frtm と入力してください.
5. frtm を一時中断して init に戻るには quit と入力します.このとき frtm の
内部状態のクリアは行いません.
I. はじめに
このプログラムは FORTH を模擬したソフトですが,完全に FORTH を再現した
ものではありません.コンパイラは持ちませんが,ユーザー定義関数では定数
や関数呼出しを定義時に解釈します.
式の解釈は逆ポーランド記法に従って行われます.if による条件分岐.
do-while, for-loop などのループのための構造文もあります.また,関数を
組み合わせて新たな関数を作ることもできます.
現在のところ扱えるのは整数のみです.数字の入力は 10 進数または 16 進数
(頭に 0x を付ける)で行えます.
frtm.h の中で各種スタックのサイズを定義しています.それぞれ,
#define STMAX 100 ; 数値計算用スタック
#define DICMAX 20 ; ユーザー定義関数の最大数
#define CSMAX 200 ; ユーザー定義関数の本体の記憶領域
#define RSMAX 100 ; ユーザー定義関数実行用スタック
#define SSMAX 80 ; ループなどの入れ子用スタック
#define MAX_NAME 8 ; ユーザー定義関数名の最大文字数
となっています.適宜変更してください.
II. 関数
□ 定義済関数
. 10 進表示
.h 16 進表示
cr 改行
sp 空白
+ 和
- 差
* 積
/ 商
% 余り
= 同値
< より小さい
<= 以下
> より大きい
>= 以上
! 真偽反転
1+ 1 加算
1- 1 減算
0= 0 と同値
abs 絶対値
max 最大
min 最小
dup 複製
swap 交換
drop 除去
over スタックの2番目の複製
rot スタックの上位3つを回転し,3番目をトップへ
rotr スタックの上位3つを回転し,トップを3番目へ
ndup スタックの n 番目を複製
nrot スタックを回転し,n 番目をトップへ
nrotr スタックを回転し,トップを n 番目へ
minus 符合変換
spaces 複数個の空白
help 関数名一覧
quit 終了
□ 文字列の表示
(Hello_World) echo cr
スタックには
'0dlr' 'oW_o' 'lleH'
と整数型にパックした文字列が入る.echo は文字列中に 0 が現れるまで順に
表示.
III. プログラム構造
□ 条件分岐
<cond> if <block 1> endif
<cond> if <block 1> else <block 2> endif
仕様
<cond> が 0 以外なら <block 1> を実行
<cond> が 0 なら <block 2> を実行
制限
else ブロックは複数書ける.
例題
0 if 1 else 2 endif . cr
□ do ループ
do <block 1> <cond> while
仕様
<cond> が 0 であれば終了.0 以外なら do に戻って繰り返し.
例題
1 do dup . cr 1 + dup 5 < while drop
1 do dup . 1 do dup . 1 + dup 5 < while cr drop 1 + dup 4 < while drop
□ for ループ
<n1> <n2> for <block> loop
<n1> <n2> for <block> <n3> +loop
仕様
<block> 終了後 n2 + 1(またはn3) を実行し,n1 より小さければ for に戻っ
て繰り返し.
I リターンスタック上の n2 をスタックに追加
制限
n1, n2 は正の数とする.
例題
5 0 for I . cr loop
10 0 for I . 5 1 for I . loop cr 2 +loop
□ コマンドの定義
: name <block> ;
仕様
name を持つコマンドを作成する.
制限
do や for のループの中ではコマンドの登録はできない.
ユーザー辞書は新しく定義されたものから順に検索するため,再帰が可能になっ
ています.また,関数を再定義されても古い関数のコードは残ります.
例題
・平均
: ave + 2 / ;
10 28 ave . cr
・階乗 [fact(1) = 1, fact(n) = n*fact(n-1)]
: fact1 1 swap 1+ 1 for I * loop ;
: fact2 dup 1 = if else dup 1- fact2 * endif ;
10 fact1 . cr
10 fact2 . cr
・フィボナッチ数列 [fib(0) = 0, fib(1) = 1, fib(n) = fib(n-1) + fib(n-2)]
: fib dup 0= if else dup 1 = if else dup 1- fib swap 2 - fib + endif endif ;
7 fib . cr
・ハノイの塔
: move1 (Move disk ) echo . swap (from ) echo . (to ) echo . cr ;
: hanoi dup 1 = if move1 else
3 ndup 3 ndup + 6 - minus 4 ndup swap 3 ndup 1- hanoi
3 ndup 3 ndup 3 ndup move1
1- rotr swap over + 6 - minus swap rot hanoi
endif ;
1 2 2 hanoi
1 2 4 hanoi
□ 辞書コマンド
help システム定義関数,ユーザー定義関数名一覧.
forget <name>
<name> を持つコマンド以降にユーザーが定義したコマンドを全部消去する.
□ コマンドの探索
コマンドはシステム辞書,ユーザー辞書の順に探索されます.ユーザー辞書は
新しく登録されたものから検索されます.
IV. ソースコードについて.
著作権は放棄しませんが,このコードの再配布,改変は営利目的でない限り自
由に行っていただいて構いません.
コメント等がいただければはげみになります.
---
(putprop '浪花 智英
'affiliation '(山口大学大学院 理工学研究科 環境共生工学専攻)
'e-mail '(naniwa@mechgw.mech.yamaguchi-u.ac.jp)
'URL '(http://scserv.mech.yamaguchi-u.ac.jp/staff/naniwa.html))