AppleScript Studio でそれなりのアプリケーションを作るときは、AppleScript のソースコードを複数に分割しないとやってられないよね。僕が作る AppleScript Stduio アプリケーションは、だいたい次のような構造をしている。
- イベントはトップレベルのスクリプトファイルにしか接続しない。
- トップレベルスクリプトはイベントのハンドリングに集中し、ほとんどの処理は別ファイルに分割する。
- スクリプト(.applescript ファイル)は、コンパイルしてバンドルの Contents/Resources/Scripts に収める。
- 実行時に will finish launching イベントなどでバンドル内のスクリプトをロードする。
皆さん、同じことしているでしょ?
さて、このやり方だと起動時にスクリプトをいっぱいロードしなくちゃいけないのだけど、できればコンパイル時に全部ロードしちゃいたいな、と思ったりしませんか。まあ、あんまり思わないよね。でも、ModuleLoader では、そんなことをしている。
ModuleLoader では、パフォーマンスが命だと思ったので、自分の為にスクリプトをいくつもロードするということをしなくたかった。で、どんなことをやっているかというと。
on import(a_name)
set pwd to system attribute "PWD"
if pwd is "" or pwd is ((path to startup disk)'s POSIX path) then
set pwd to "/Path/to/Project/"
else
set pwd to pwd & "/"
end if
return run script POSIX file (pwd & a_name & ".applescript")
end import
property ModuleCache : import("ModuleCache")
property XList : import("FastList")
property ConsoleLog : import("ConsoleLog")
property PropertyAccessor : import("PropertyAccessor")'s initialize()
property ModuleInfo : import("ModuleInfo")
という感じ。
まず、ソースファイル(.applescript ファイル)の場所を求めなければならないけど、コンパイル時は環境変数 "PWD" にあると仮定している。XCode のエディタでの構文チェック時は "PWD" はソースファイルの場所に成らない。しょうがなく、ファイルがある場所を書き込んでいる。そして、run script コマンドでソースのコンパイル/実行を行い、その実行結果を保持しておくことができる。
いくつか醜いところがある。
- Xcode の編集中の構文チェックのために、スクリプトファイル(プロジェクトがある場所)がある場所を書き込んでしまっている。
- run script コマンドのでの返り値しか取り込めない。すなわち、ロードされる側は、次のような run handler を仕込んでおく必要がある。これはたいした問題じゃないか。
XCode の編集中の構文チェックでも、ソースコードがある場所をを取得することができれば不満が解消されるのだけど。
もし、どうしても必要になったら真似してちょうだい。