Script Provider

OpenOffice.org には Scripting Framework がありマクロを色々な言語で書くことができる。新しく言語を追加することもできるため好きな言語でマクロを書くこともできる。

もちろん言語 - UNO ブリッジが必要であるが Ruby でもマクロが書けるようにしたいところ。

Ruby での問題は実行するマクロをどういう単位にするかということ。組み込まれた OpenOffice.org Basic、JavaPython では関数単位での実行。BeanShell、JavaScript ではファイル単位。その他の Groovy、ooRexx はファイル単位。以前作成した Jython では関数単位にした。JRuby のものも作成したがどのようにしたか忘れた・・・。

JRuby ではファイルごとにランタイムを初期化することが容易だったためファイルに含まれるトップレベルの関数が特定できた。一方で、Ruby 用の Script Provider を Ruby で書くことにしたため Ruby のトップレベルのフレームはローダーが初期化した Ruby ランタイム一つになる。

Ruby ではファイル単位での実行すら難しい・・・。Python ではファイルがモジュールとして分かれており別のモジュールを汚染することはない。Ruby の module とは異なる。

ファイル内で一つまたはそれ以上のモジュールを定義してそのモジュールの特異メソッドをそのファイルで実行できる関数とする・・・?しかし同名 module の定義で拡張が可能なわけだから新しく読み込んだファイルでどの module が定義されたのかを完全に特定するのは難しい。

ファイル単位での実行にするより他ないんじゃないだろうか。

Scripting Framework 特有のグローバル変数として XSCRIPTCONTEXT がある。これはスクリプトOOo に容易にアクセスできるようにいくつかのサービスを提供してくれるインターフェース。Ruby ではグローバル変数は $ で始まるので変数名は $XSCRIPTCONTEXT とする。この変数を提供するのは Ruby 用の script provider が初期化されたときになる。ここでの問題は script provider が初期化されたあとでは Rubyインスタンスが共通のため全ての他のコンポーネントなどの実装でもこの変数にアクセスできるようになってしまうこと。これを回避するには script provider も C++ で実装して別の Ruby インスタンスを初期化するしかない・・・。

load の priv 引数を true で無名モジュールの下に読み込むしかないか。

module_eval という手があるのか・・・。