[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bfree-prj 37] Extension to Mitten (FORTH Modoki)



はじめまして.浪花と申します.

突然ですが,b-free-pc.0.0.40 の Mitten の追加コマンドの形で FORTH 
もどきの言語の処理系を作りました.ソースを
  http://scserv.mech.yamaguchi-u.ac.jp/~naniwa/comp/bfree/frtm-bf.tar.gz
に置いてありますので,よろしかったらお試しください.

以下は簡単ですが付属のドキュメントです.

------

FoRTh Modoki for bfree
ver 1.0.1  Feb. 16, 1999. by 浪花 智英 (naniwa@mechgw.mech.yamaguchi-u.ac.jp)

O. BFREE でのコンパイル
手順
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 50    ; ユーザー定義関数の最大数
#define CSMAX 200    ; ユーザー定義関数の本体の記憶領域
#define RSMAX 100    ; ユーザー定義関数実行用スタック
#define SSMAX 20     ; ループなどの入れ子用スタック
#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番目をトップへ
minus	符合変換
spaces  複数個の空白
help	関数名一覧
quit	終了

□ 文字列の表示
(Hello_World) echo
スタックには
    0 d l r o W _ o l l e H
と入る.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 end if

□ 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

□ 辞書コマンド
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))