2010-04-05T20:24:29+09:00

ModuleLoader FAQ

ModuleLoader に関して、FAQ 形式でまとめてみた。全然 frequently に ask されてないけど、frequently に ask されたい question です。他に、FAQ として上げるべきことがあったら教えてください。

用例集みたいなものも必要かなと思っています。

モジュールってなに?

他のスクリプトから読み込まれて(ロードされて)使われるスクリプトファイルのこと。ライブラリと呼ばれることもある。

モジュールを活用してプログラムすることで、より高機能なものを、より少ない手間で作ることができるはず。

ModuleLoader では、スクリプトファイル(.scpt ファイル)、スクリプトバンドル(.scptd ファイル)、スクリプトアプリケーションをモジュールとして扱うことができます。モジュール側のコードに特別な配慮は何にもいりません。スクリプトエディタで保存した物は全部モジュールになります。

Version 2.1.1 の時点では、テキストファイルである .applescript ファイルはモジュールとして扱えないけど、次のバージョンではロードできるようになります。

load script コマンドより何がいいの?

ロードするモジュールの管理が楽になって、ロードのためのコードが最小限にできます。具体的には、

などができます。

一つ二つのスクリプトをロードするなら、load script でもそんなに苦にならないかもしれない。でも、5つくらいのモジュールをロードして、さらにそれらが別のモジュールに依存するなんて状況になると、load script ではやってられなくなります。

とにかく、モジュール/ライブラリのロードには、load script コマンドではなく、ModuleLoader をご検討ください。

モジュールの置き場所は?

デフォルトでは、~/Library/Scripts/Modules/ もしくは /Library/Scripts/Modules/ です。このフォルダ以下にスクリプトファイルを置けば、名前を指定するだけでモジュールをロードできるようになります。サブフォルダの中も探しに行きます。

モジュールの置き場所のカスタマイズはこちらを参照してください。

現在設定されている、モジュールの置き場所は、module paths コマンドで調べることができます。

module コマンドって何の役割をするの?

module コマンドは、必ず peroperty の定義文の中に置いてください。module コマンドは、その property がモジュールを呼び込んで設定する場所である印をつけます。実際には、module specifier クラスの値を設定します。

実際のモジュールのロードと設定は、boot コマンドによって行います。

module loader コマンドって?

loader object と(僕が)呼んでいるスクリプトオブジェクトを生成します。loader object は、ロードしたモジュールをキャッシュしたり、モジュールが依存しているモジュールを設定したりします。

loader object って?

module loader コマンドが生成するスクリプトオブジェクトです。

次のメソッドを持っています。

boot コマンドって?

loader object に実装されているコマンドです。for パラメータに与えられた、スクリプトオブジェクトで、module コマンドが実行されている property を調べ、その property にロードしたモジュールをセットします。

実際には、

boot (module loader) for me

と書くことになるでしょう。

モジュールの中で別のモジュールを使いたいのだけど。

module コマンドを置いた property を書いてください。たとえば、ModuleA の中で、ModuleB を使いたいとします。

property ModuleB : module

というように。このModuleA がロードされる時に、ModuleB も自動的に読み込まれて設定されます。ただし、ModuleA のロードには、loader object の boot コマンドか load ハンドラを使ってください。load module コマンドを使うと、ModuleB はロードされません。

load module コマンドって

モジュールの置き場所からモジュールを読み込みます。ただし、loader object の boot コマンド、load ハンドラのように、モジュールの依存性の解決やモジュールの同一性の確保は行いません。

ちょっとだけ賢い load script コマンドみたいなものです。ModuleLoader のおまけで、モビルスーツの足のような物です。

モジュールの場所を追加したい。

カスタムなモジュールの置き場所を追加したいときは、set additional module paths to コマンドを使ってください。このコマンドで追加した、場所は設定ファイルに保存されて、別のアプリケーション/次の ModuleLoader の呼び出しにも反映されます。

スクリプトの実行中に一時的にモジュールの場所を追加したい場合は、loader object の set_additional_paths ハンドラを使ってください。

モジュールのバージョンを指定したい。

今のところは、そういう機能はないです。でも、ModuleLoader を使ってくれる人が増えてきて、要望が上がるようになったら実装します。自分一人で使っているなら必要ないですからね。

loader object のキャッシュをクリアしたい。

boot コマンド、load ハンドラでロードされたモジュールは、loader object の中にキャッシュされます。モジュールの同一性を確保する為です。

折角読み込んだモジュールでも、メモリを節約したいなどの理由でのキャッシュをクリアしたくなるかもしれません。モジュールキャッシュの破棄は、loader object の clear_chache() で行えます。しかし、これで読み込んだすべてのモジュールが破棄される訳ではなく、 property やグローバル変数に設定されているモジュールはそのままです。どこにも使われていないモジュールだけが破棄されます。また、パージされなかったモジュールとの同一性の確保はできなくなります。

もしわけないことに、version 2.1.1 の clear_cache() はバグっていて、実行すると、その loader object が使えなくなります。clear_cache() したら module loader コマンドで 新しい loader object を作ってください。

次のバージョンで修正します。