おはようございます、高木です。

前回の投稿では、次のように都度インタープリタを指定せざるを得ないのではないかという話をしました。

これでもいいんですが、ひとつ大きな問題があります。
それは、コールバックに、ラムダ式でも普通の関数でもいいのですが、ネイティブコードを渡そうすると、Tcl_CreateObjCommand関数でその都度コマンドを追加することになります。
Tcl_CreateObjCommand関数を呼び出すにはTcl_Interp*が必要にありますので、ひとつの式の中で何度もインタープリタを指定しなくてはなりません。
さすがにそれは面倒です。

よくよく考えてみると、典型ケースではインタープリタはひとつしか使いません。
アプリケーションユーザーが書いたスクリプトを実行させるような場合には、セーフモードにしたスレーブのインタープリタを作るかもしれません。
せいぜいその程度でしょう。

一応、Tclの仕様では、マスターとなるインタープリタをいくつでも作れますし、マスターごとにスレーブをいくつでも追加できるようになっています。
けれども、そんなインタープリタだらけのシステムは何に使うのか想像もつきません。

一応、複数のインタープリタを使い分けられるようにしておいた上で、カレントインタープリタを登録させるほうが得策な気がしてきました。
典型ケースでは、最初にカレントインタープリタを設定して、以後そのまま使用し続けることになります。
そして、関数の内部でカレントインタープリタを使用すればいいのです。

これだと、ネイティブコードをコールバックさせる場合でも、次のように簡単に書けそうです。

あるいは、いっそのことafterのようなコマンドごとに関数を作ってしまって、

としてもいいでしょう。

幸いにして、Tclのコマンドはそんなに多くないので、ひととおり作れてしまいそうです。
ただし、TclOOや名前空間に関するコマンドはいらない気もします。
ファイルシステム周りも不要かもしれませんね。少なくとも優先順位はかなり下げてもよさそうです。

カレントインタープリタの概念を導入することで、手軽さが飛躍的に向上しそうです。
何はともあれ完成させなければ意味がないので、その点については努力あるのみです。