スクリプトの読み込み

スクリプト読み込みの問題

 AppleScriptは、外部のスクリプトを利用できる仕組みが用意されています。
 しかし、Perl等にくらべると、その活用のされ方はイマイチ感は否めません。
 問題は色々あります。

 といったところでしょうか。
 Macintosh Lab.の「スクリプト共有ライブラリ規格」に詳しいことが書かれていますから、そちらも参照してもらうと、理解が深まると思います(ちなみに、本Tipsでは、Macintosh Lab.の「スクリプト共有ライブラリ規格」には準拠しません)
 ここでは、基本的な利用方法について解説します。

run script命令

 単に外部のスクリプトのrunハンドラを使いたいだけなら、run script命令を使うのが便利です。ただし、run script命令はrunハンドラ以外を実行できないという制限があります。
 "Macintosh HD"ボリュームに"a.scpt"というファイル名で、スクリプトを保存している場合、次のように書きます。

run script file "Macintosh HD:a.scpt"

 指定するのは、アプレット、コンパイル済みスクリプト、その他スクリプトを含んだファイル、どれでもかまいません。

load script命令

 load script命令は、完全にスクリプトを、スクリプトオブジェクトとして読み込む命令です。
 アプレットもしくはコンパイル済みスクリプトを保存する場所は特に決められていませんが、"システムフォルダ:スクリプト:"フォルダに保存して、そこから読み込んで使うのが一般的です。

set scriptFolder to path to scripts folder as string
set scriptObj to load script file (scriptFolder & "sample.scpt")

-- "sample.scpt"のrunハンドラを使う
tell scriptObj to run
-- もちろん"sample.scpt"に含まれているハンドラないら、run以外のハンドラでもいい
tell scriptObj to handlerX()

 スクリプトオブジェクトは、メモリに読み込まれますから、アプレット等のメモリ割り当てを大きめにしておく必要があります。

 Mac OS Xでは、幾つかおける場所がありますが、homeフォルダの"〜/Library/Scripts/"を利用するのがいいでしょう。
 その場合はpath toの引数(option)にfrom user domainを指定します。
 ちなみに、as stringもpath toの引数なので、fromはasの前でも後でも構いません。

set scriptFolder to path to scripts folder as string from user domain

属性(property)にオブジェクトを入れる

 読み込んだオブジェクトをスクリプト全体で使いたい場合、局所変数に入れておくと面倒です。
 大域(global)変数に入れておく手もありますが、属性を利用した方が楽です。
 大域変数そのものに問題があるということもありますが、属性は構文確認時に初期値が設定されるので、毎回読み込む必要がなく、スクリプトの起動が速くなります。また、いったん保存してしまえば、次回構文確認を行うまで、読み込み元のファイルがいらないってのも利点です。
 逆に欠点としては、属性に読み込んだスクリプトオブジェクトは、スクリプトファイルに保存されるので、ファイルサイズが多少大きくなります。また同様の理由で、元のファイルを変更しても変更が構文確認されるまで、読み込み先のスクリプトに反映されない(結構、致命的欠点かもしれないけど)ということがあります。
 属性の初期値の場所には命令を書くことができますから、次のようなスクリプトを書けば、"スクリプト"フォルダにある"sample.scpt"というファイルからスクリプトを読み込めます。

property scriptObj_ : load script alias ((path to scripts folder as string) &"sample.scpt"

-- runハンドラを実行
run of scriptObj_

読み込みハンドラを用意する

 スクリプトの読み込みは頻繁に行うものですから、ハンドラを用意しておくのが無難だと思います。
 各自で用意してもいいのですが、一応、私が使っているやつを公開しておきます。
 引数にはスクリプトファイルの名前を文字列で渡します、"システムフォルダ:スクリプト:"にあるスクリプトファイルを読み込んで、結果にスクリプトオブジェクト(への参照)が返ります。

set scriptObj to loadScript("sample.scpt")

on loadScript(scriptFile)
	set scriptFolder to path to scripts folder as string
	set scriptFile to scriptFolder & scriptFile
	try
		return load script file scriptFile
	on error number n
		if n = -43 then
			error "\"" & scriptFile & "\"がありません"
		else if n = -192 then
			error "\"" & scriptFile & "\"は、スクリプトファイルではありません"
		end if
		error number n
	end try
end loadScript

 残念ながら、スクリプトの読み込み用のハンドラ自体を読み込むわけにもいきません。
 このハンドラだけは、コピーして使うしかないですね。


2002-01-06