新城@筑波大学情報です。こんにちは。

In article <m3ptc9l1vn.fsf@nospam.maedapc.cc.tsukuba.ac.jp>
        MAEDA Atusi <maeda-news@ialab.is.tsukuba.ac.jp> writes:
> > Forth は、late binding ではないのですが、再定義できます。同
> > じ名前の手続きを呼ぶと、古いものに対して stacking されます。
> > 再帰はできません。たとえば、
> 
> SunのROMモニタにはrecというwordがあったような。

Sun の ROM モニタは、F83 だから。see の逆コンパイラなんか、
「そこまでやるか」って感じです。

F83 って、ソースが comp.sources に流れた気がするのですが、ど
こに行ったんでしょうね。

ROM モニタというと、Apple にも Forth が入っています。
起動時に Command+Option+O+F だったかなあ。OpenFirmwareの意味
です。

http://www.openfirmware.org/

さっき見たら PowerBook G4 の ROM には rec はなかったみたいです。

Forth で再帰するなら、変数に番地を入れてやるんだったかなあ。
あ、忘れた。

variable wptr 
: f ... wptr @ call ... ;
' f wptr !

void (*wptr)();
f() { ... (*wptr)(); ... }
main() { wptr = f; }

call って無かったような気がするんだけどなあ。リターンスタッ
クに積んで ret でもどるか。

: f ... wptr @ >r ;S ... ;

戻る命令わすれた。;S で良かったかなあ。この作戦なら、call は
これでもいいか。

: call r> drop ;

自己再帰でよければ、

: f .... [ ' f , ] ... ;

でもいいかも。' での検索は、定義中はかからなかった気がするか
らなにかフラグをぐにょぐにょしないといけなかったかも。となる
と

: rec 現在定義中のコードの先頭を取ってくる , ; immediate

でもいいかも。immediate で即実行でコンパイル時に働くものにし
ます。

> PostScriptでは「辞書スタック」が環境に当たります。同じ辞書に複数の名前
> を定義すれば、相互再帰ができますね。辞書は書き換え可能ですから、定義を
> 上書きできます。また、辞書をプッシュして名前を定義すると、上書きでなく
> 名前を一時的に隠す(shadowする)こともできます。

Forth の辞書は、append only で、定義の逆順にサーチです。複数
の辞書(vocabulary) は作れます。F83 は検索用は8個くらいまで
スタックにできたかなあ。標準は、検索用(context)が1つに定義
用(current)が1つ。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\