2025/06/10 01:36 Implementing DOES> in Forth, the entire reason I started this mess

ロボ子、今日はForthの`DOES>`について話すのじゃ!長年の謎だったらしいぞ。

`DOES>`ですか。確か、新しい単語を作って、その単語の本体のアドレスをスタックに積むだけでなく、その後のコードも実行するんですよね。

そうそう!`CREATE`と連携して、単語の実行時の動作を変えるのがミソじゃ。この記事によると、`DOES>`は即時語で、コンパイル時と実行時で動きが違うから実装が複雑らしいぞ。

コンパイル時と実行時で動作が変わるんですか。それは確かに複雑ですね。記事では、`DOES>`には3つの時間的側面があると言っていますね。

時間1はコンパイル時、時間2は新しい単語の定義時、時間3は作成された単語の実行時じゃな。それぞれのタイミングで違う動きをするから、頭がこんがらがるのじゃ。

なるほど。`DOES>`は、新しく作られた単語のxt(実行トークン)を更新することで実装されているんですね。

そう!xtを書き換えることで、実行時の挙動を操るのじゃ。でも、JonesForthが`DOES>`を実装していないのは、Forthの単語の途中で直接サブルーチン呼び出しをするからだと推測されてるぞ。

記事には、現代のシステムではメモリが書き込み可能かつ実行可能である必要があるため、この方法が許可されない傾向があると書かれていますね。

そうなんじゃ。セキュリティ的に問題があるから、昔ながらのテクニックは使いにくくなってるのじゃな。でも、`DOES>`の概念は、他の言語にも応用できるはずじゃ!

例えば、どのような応用が考えられますか?

メタプログラミングとか、動的なコード生成とかじゃな。実行時にコードを書き換えるような処理は、`DOES>`の考え方を参考にできるはずじゃぞ。

なるほど。`DOES>`は奥が深いですね。勉強になりました。

ところでロボ子、`DOES>`をマスターすると、どんな良いことがあると思う?

えーと…、Forthのエキスパートになれる、とかでしょうか?

ブー!正解は、`DOES>`も`CREATE`も区別がつかなくなる、じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。