インターネット&PC120%活用:PC活用編

FORTHの入手

1 FORTHの入手
(1) FORTHとは
FORTHはスタックを使用したかなりかわったプログラム言語です。LISPよりももっと異色といえるかもしれません。
初心者にはピンとこないかもしれませんが、スタックについて理解できれば面白い言語です。
自分で、新しい命令(FORTHでは”ワード”と呼びます)を定義して、それを使うことができる点が特色で
自分にとって使いやすい命令を定義(新設)して、自分仕様のFORTHに育てる?ことができます。

(2) FORTHの入手
Vectorから入手できます。
おじさんは、Forth32w(One-Knight氏作 F32W24Y.lzhという圧縮ファイルになっていました)を使っています。

2 FORTHを使って見る
(1) インストール
Forth32wは解凍するだけで使えます。解凍したら全てのファイルを同じフォルダ(ディレクトリ)に
入れておいてください。いろんなバージョンの実行ファイルがありますが、DOS/V機のDOS窓で使うなら、
Forth32w.exeを使って下さい。

(2) 起動と新規ソースファイル作成
DOS窓上でForth32w.exeを起動すると、コマンド入力待ちになります。

プログラムはBLK形式のファイル(拡張子 .blk)で管理されています。
BLKファイルの中は、400バイト単位で管理されており、最初の400バイトが BLK #0 と呼ばれ
次が BLK #1 と呼ばれます。

まず、CREATE-FILE で新しいソースファイルを作りましょう。
10 CREATE-FILE pract1.blk
で#10までのpract1.blkを作成します。

E:\f32v24y>forth32w

Welcome to Forth!
FORTH on Wdpmi, ver.2.4y(c) Mar, 1999 by one-knight
svga+, oem = S3 Incorporated. M5 BIOS

10 CREATE-FILE pract1.blk

 

(3) ソースファイル編集
ソースファイルの編集をして、コードを記述してみましょう。
まず、スースファイルをオープンします。
open pract1.blk
これで、先ほど新しく作成したpract1.blk がオープンします。

そうしたら、コードの記述をしましょう。
エディタを起動します。sed がエディタです。
1 sed
とすると、pract1.blk #1 が編集可能になります。
sedはラインフェディタなので、かなり使いにくいかもしれません。20年前を思い出します。
編集コマンドは後述します。

以下のようにコードを打ち込んで下さい。
打ち込み終わったら、<Esc>を押し、Sキーを押して下さい。これで、最新のコードが上書き保存されます。
エディタでの編集を終わるには、<Esc>+Qです。

open pract1.blk %w


1 sed

SCR #1 ---- 0 pract1.blk -----------------------------------
0|1 . 
1|5 2 1 + . .                           |
2|1 2 - .                             |
3|7 5 * .                             |
4|variable A                            |
5|5 A ! echo ; cr                         |
6|A @ .                              |
7|A .                                |
8|A @ 5 * .                             |
9|variable F                            |
10|A @ 9 * F !                           |
11|F @ .                              |
12|5 2 swap . .                          |
13|1 2 3 drop . dup . .                      |
14|                                |
15|                                |
------------------------------------------------------------------
Q S R C P L N B G Z J K(ill) A(ll-kill) 0,1,2,3 (file-no)
p(U)sh p(O)p I(nterpret) F(iles) M(emory) W(hat) E(dit)
        
   


【 編集コマンド 】
編集コマンドは、 CTRL-文字 と ESC+文字 の二本立てです。CTRL-文字の方は
個々の文字または、行の編集を行い、ESC+文字の方は BLK全体の編集を行います。

< CTRL-文字>
CTRL-S カーソルを一字分左へ移動。
CTRL-D 〃 右へ移動。
CTRL-E 〃 一行上へ移動。
CTRL-X 〃 下へ移動。
CTRL-A カーソルを行の先頭へ。
CTRL-F 〃 末尾へ。
CTRL-W 〃 先頭の行へ。
CTRL-Z 〃 一番下の行へ。
CTRL-H バックスペ−ス。
CTRL-G 削除。
CTRL-M 改行。
CTRL-N 現在行以降を押し下げて空白行を挿入。
CTRL-K 現在行をバッファのトップへプッシュしてからクリア。
CTRL-Y 現在行を削除。削除された行はバッファヘプッシュ。
CTRL-U 現在行をバッファへプッシュ
CTRL-O バッファの先頭行をポップして現在行へコピー。
CTRL-B バッファの先頭行を現在行へコピー(ポップしない)。
CTRL-V 挿入/重ね書き モ−ド切替え。
CTRL-Q 検索。

<ESC+文字> ESC キーを押すとメッセージが出ます。
Q エディタの終了。終了後元のエディタに戻るには EP。
S 現BLK が UPDATE されていればそれをストア。一度クローズします
 から、 完全に書き込まれます。その後またオープンします(注意を
 参照)。編集したBLKはその都度ストアするのが FORTH 流です。
P 現BLK を変更以前の状態へ戻します。いったんストアしてしまえば
 元には戻せません。

N 次のBLKへ。
B 前のBLKへ。
Z BLK #0 へ。
G 変数 GDNO で指定された BLK へ( GDNO=7 となっています)。
J 入力待ち。入力番号の BLK へジャンプ。
L 現BLK の前に編集していたBLKへ。
U 現BLKをバッファへプッシュ。
O バッファ内容を現BLKへコピー。
C 現BLK をクリア。
R 現在行から実行。
I インタープリタに入ります。殆どのワードは実行出来ます。
E 入力名のファイルをオープン。編集ファイル番号が付けられ、
 現編集ファイルとなります。
0 #0 ファイルを現編集ファイルとします。
1 #1 〃
2 #2 〃
3 #3 〃

K 入力待ち。入力番号のファイルをクローズし編集ファイルから
 外します。現ファイルはクローズできません。
A すべての編集ファイルをクローズし編集を終了。

F 編集ファイルの名前、サイズ、編集番号を示します。
M ディスク・バッファの状態を示します。
 UPDATE されたBLK には * 印が付きます。
W カーソル位置以降始めての単語の定義内容を示します。


(4) BLKファイルのリスト表示と実行、終了
現在オープンしているBLKファイルの#1のリストを見る時は、
1 list
とします。

また、実行する時は
1 load
とします。

Forthの終了はByeです。

1 list
SCR #1 pract1.blk
  0 1 .
  1 5 2 1 + . .
  2 1 2 - .
  3 7 5 * .
  4 variable A
  5 5 A ! echo ; cr
  6 A @ .
  7 A .
  8 A @ 5 * .
  9 variable F
  10 A @ 9 * F !
  11 F @ .
  12 5 2 swap . .
  13 1 2 3 drop . dup . .
  14
  15
%w
1 load 1 3 5 -1 35 A isn't unique.
5 131740 25 F isn't unique. 45 5 2 2 1 1 %w
bye
E:\f32v24y>


3 ワードについて
Forthでは、他のプログラム言語における命令のことをワードと呼びます。
上記のpract1.blk に記述したワードを簡単に説明しながら、Forthという言語の特徴に触れてみたいと
思います。上記のloadの結果と照らし合わせながら見て下さい。

Forthはスタックにデータを積んだり、取り出したりすることにより動作します。
ここでは、一番上のスタックをスタックトップ、2番目のスタックをスタック2という風に呼ぶことにします。

. ピリオドはスタックトップの整数を表示します。
0行目 1 .  は1を表示します。動作は以下のようです。
(赤色の数字を画面に表示します。この表では、スタックトップの数値を便宜上残して記述していますが、
この時、実際には赤色の数字=スタックトップの数値は、捨て去られることに注意して下さい。)

ワード 1 .
スタックトップ 1 1
スタック2    
スタック3    

+ は加算です。スタックトップとスタック2の数値を足して、スタックトップに格納します。
1行目 5 2 1 + . . は以下のような動作をし、まず2+1 の結果の3を表示し、次に5を表示します。

  5 2 1 + . .
スタックトップ 5 2 1 3 3 5
スタック2   5 2 5 5  
スタック3     5      

- は減算です。スタックトップの数値からスタック2の数値を引いて、スタックトップに格納します。
2行目 1 2 - . は、1-2 で -1が結果として表示されます。

*は乗算です。スタックトップとスタック2の数値を掛け算し、スタックトップに格納します。
3行目 7 5 * . の結果は、35を表示します。

変数を作るには、variable を使います。
4行目 variable A で変数Aを作ります。

変数に数値を入れるには、! を使います。
5行目 5 A ! で変数Aに5が入ります。
その後の echo は文字列を表示するワードです。 echo ; cr は改行動作となります。

変数の値を読み出すには@を使います。
6行目 A @ . で変数Aの値を読みだし、表示します。Aには5が代入されていたので、5が表示されます。

7行目のように、A . とするとどうなるでしょうか。
loadの結果を見ると、131740という結果が表示されています。これは、変数Aの値が格納されている
アドレスだと思われます。このように、変数Aの値が欲しい時は、A @ と記述しなければなりません。
以上より、6行目の動作は以下のようだと推測されます。(しみません、おじさんの推測です)

  A @ .
スタックトップ 131740 5 5
スタック2      
スタック3      

8行目 A @ 5 * . は以下のような動作となり25を表示します。

  A @ 5 * .
スタックトップ 131740 5 5 25 25
スタック2     5    
スタック3          

9行目は変数Fを作っています。
10,11行目は、以下の動作により、45を表示します。

  A @ 9 * F ! F @ .
スタックトップ 1317140 5 9 45 Fのアドレス   Fのアドレス 45 45
スタkツク2     5   45        
スタック3                  

swap はスタックトップとスタック2の数値を交換します。
12行目 5 2 swap . . は、5 2 の順で表示されます。動作は以下の通りです。

  5 2 swap . .
スタックトップ 5 2 5 5 2
スタック2   5 2 2  
スタック3          

drop スタックトップのデータを捨てます
dup スタックトップの数値を複製してスタック2にコピーします。
13行目 1 2 3 drop . dup . . は、2 1 1 の順で表示します。動作は以下の通りです。
drop の後の . で、スタックトップの”2”はなくなり、スタックトップは”1”になりますので、
dupで1が複製されます。

  1 2 3 drop . dup . .
スタックトップ 1 2 3 2 2 1 1 1
スタック2   1 2 1 1 1 1  
スタック3     1          




TopPage


 

inserted by FC2 system