2010-04-04T11:31:21+09:00

ModuleLoader で実行時にモジュールをロードする時の注意点

まずは、ModuleLoader を使った、次のようなスクリプトを見てください。このスクリプトでは、

することを意図しています。

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

tell loader
set ModuleC to load module "ModuleC"
end tell

でも、このスクリプトは期待通りに動かないぜ。どううまくいかないかというと、2回目以降の実行で ModuleC がファイルからロードされない。一回目の実行で ModuleC は、変数 loader の loader script にキャッシュされて、2回目以降の実行ではキャッシュされた ModuleC が load module コマンドから返ってくる。実行時には毎回ファイルから読み込んでほしいよね。

残念ながら、完全な回避法を思いつかない。いくらか妥協した次の二つの回避方法を思いつく。

モジュールのロードは実行時にまとめる

次のように、boot (module loader) for me を実行時に移して、コンパイル時に ModuleA をロードすることをあきらめる。

property ModuleA : module

tell (boot (module loader) for me)
set ModuleC to load module "ModuleC"
end tell

実行時のロードには別の loader script を用意する

次のように、実行時に module loader コマンドを実行して、コンパイル時に使用する loader script とは別のものを使う。この方法の問題点は、ModuleC が ModuleA に依存していた場合、ModuleC が参照する ModuleA とコンパイル時にロードした ModuleA が別物になるということ。モジュールの同一性が完全には保たれない。

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

tell (module loader)
set ModuleC to load module "ModuleC"
end tell

どっちがいいかは、よう分からん。

追記 : キャッシュを無視して、ファイルからのロードを明示することができれば、上記の問題を解決できることに気づいた。次の version での機能追加事項にしよう。