2010-04-04T09:52:29+09:00

バンドル内のスクリプトを ModuleLoader でロードする方法

ModuleLoader を使って、スクリプトアプリケーションもしくは AppleScript Studio アプリケーションのバンドルの中にあるスクリプトをロードする方法を紹介する。

正直、バンドル内のスクリプトのロードの為に ModuleLoader を使うことはおすすめしないぜ。コンパイル時に、全部のモジュールをロードしておけば、実行時に ModuleLoader へのいらぬ依存性を抱えなくても済むからだ。

でも、そういうことにも ModuleLoader は対応できるよ、という柔軟性を示したい。

property ModuleA : module
property loader : boot (module loader) for me

loader's set_additional_paths({((path to me)'s POSIX path) & "Contents/Resources/Scripts/"})
tell loader
set ModuleC to load module "ModuleC"
end tell

module loader コマンドは、ロードしたモジュールのキャッシュやモジュールの依存性の解決などを行うスクリプトオブジェクトを生成するコマンドです。module loader コマンドによって生成されたスクリプトオブジェクトを loader object と呼ぶことにしましょう。

loader object の boot コマンドは、 for パラメータに与えられたスクリプトオブジェクトの property を調べ、module コマンドが置かれている property をモジュールに置き換えます。boot コマンドの返り値は、loader object そのものです。

loader object の set_additional_paths を使うと、モジュールの置き場所を実行時に追加することができます。そして、loader object に対して load module コマンドを送ることができます。OSAX の load module コマンドとは違い、ロードしたモジュールの依存性の解決、モジュールの同一性の確保が行えます。

ModuleLoader には、こういう自分がいらないと(今は)思っている undocumented な機能がいっぱいある。もしくは追加できる余地がある。実際とのところ、何があると便利なのか教えて欲しい。