2020-04-23T01:28:23+09:00

ModuleLoader 4.0.4 : AppleScript の近代的なライブラリシステム

ModuleLoader は AppleScript のライブラリシステムです。必要最小限の記述で外部のライブラリ/モジュールとしてのスクリプトをロードすることができます。

OS X 10.9 から AppleScript にライブラリ機能がサポートが追加されました(AppleScript Libraries) 。ModuleLoader は、それ以前の2006年から継続的に開発/メンテナンスされてきたライブラリシステムです。おおよそ AppleScript Libraries と同じことができます。

すなわち、

OS X 10.9 以降では、AppleScript Libraries がファーストチョイスになるでしょう。ModuleLoader は、AppleScript Libraries と共に使うことができ AppleScript Libraries に次のような機能を追加します。

変更点:

AppleScript Libraries に無い ModuleLoader の機能の一つとして、バージョン番号の指定に不等号「>, <, >=, <=」が使えることです。AppleScript Libraries でバージョンを指定すると、指定したバージョン以上が必要ということになりますが、ModuleLoader は、指定したバージョン以下、という指定ができます。未来だけを見据えていれば、指定したバージョン以上という条件だけ事足ります。しかし、たまに後方互換性を確保したスクリプトを作りたい場合、指定したバージョン以下という条件でライブラリを読み込めると便利です。

不等号を使ってバージョン指定を行うのは、自分のアイデアではなく、AppleMods を真似しました。

バージョン番号の不等号をの解釈に ICU ライブラリの C API にアクセスしています。OSAX を作っていた頃は、NSRegularExpression とか無かったし、CoreFoundation でゴリゴリすることに快感を覚えていましたので、CoreFoundation 類似のインターフェースの正規表現モジュールを作りました。その中で ICU に渡す buffer のサイズが足りず、不正なメモリアクセスを発生させていました。

こういうメモリ関連のエラーは再現性が乏しいし、コードを間違えている箇所でエラーが発生しないので、発見が大変難しいです。生の C 言語で malloc とか free とかするもんじゃ無いな、とつくづく思います。Objecctive-C とか Swift とかで書き直すべきと思いますが、手塩にかけたコードが惜しくてまだ捨てられません (^_^;A。