AppleScript StudioはMac OS X 10.4になって不可思議なバグを抱えるようになった。
Interface Builderで簡単にGUIが作れて、各種GUIのアクションからScriptを実行できるというAppleScript Studioの「方向性」はしごくまっとうなものだ。
ただし、一般のスクリプターがスクリプトエディタの延長線上にあるものとしてステップアップするには、Interface BuilderやXcodeはツールの概念や操作体系が違いすぎて、すんなり移行できるものではないだろう。USのMLでもAppleの担当者が総スカンをくらっている所以だ。
もともとInterface Builderは開発言語系に応じてインスペクタの表示がコロコロ変わったりで、本来NeXTstep環境下でObjective-Cでの開発を行うツールだったころにあったはずのシンプルさは失われているのではなかろうか。
さらに、AppleScript Studio環境はXcode+Interface Builderの中に間借りしているような状態なので、かなり実装に「無理矢理感」を強く感じる。Xcode上でスクリプトを書いているとものすごく重い感じがするが、Objective-Cだとスカスカだ。それとも、AppleScriptの巨大なプログラムを作り過ぎということなのだろうか……?
それでもまあ、自分もなんとか世界中のサイトから資料を集め、さらに本を何冊も買って独学で理解した(これがそろいもそろってひどい本ばかりだった)。AppleScript Studioに着手したのは比較的遅い時期だったが、一応すぐに使えるようになったのだ。
Xcode+Interface Builderの「難しさ」に立ち向かった後には、さらにAppleの「サボタージュ」に負けずに立ち向かう必要性が出てくる。
Mac OS X 10.4以前からもおかしな挙動はあったのだが、10.4になってより顕著になったのが……「AppleScript StudioランタイムがAppleScriptの重さに耐えかねて自壊する」という現象だ。
ある一定の長さ(そんなに長くない)までは想定通りの挙動を行うものの……「ある長さ」を超えた瞬間に挙動がおかしくなる。Mac OS X 10.2の頃に直面した「デフォルトで確保しているスタックサイズが小さいために大きなプログラムをビルドできない」という現象が思い出されるが、そんなもん、コマンドラインからdefaultsコマンドを叩いて一発で回避できた(junさんから教えていただいた)。
自重に耐えかねて自壊する現象は、ランタイムだけの話ではないかもしれないが、とにかくプログラムを書き進めていったときに直面する理解不能かつ理不尽な問題が多すぎである。
自壊現象には、いくつかの傾向が見られる。
(1)文法の解釈が突然偏屈になる
外部のアプリケーションをコントロールする際に顕著なのがこの現象だ。tellブロックのネスティングをほとんど許容しなくなり、ネスティングが浅くなるように書き換えると動くようになったりする。構文確認ではエラーにならず、ランタイム時になんの警告もなく実行停止するので、ものすごくタチが悪い。
(2)クラスの取得が正常に動かない
とくに変数のクラスを取得しようとして、
set aVal to {"string in the list"}
set aClass to class of aVal
set aValStr to aClass as string
などと書くことがある。もちろんこれは、あくまでもサンプルであって「太郎くんは男の子です」「では、太郎くんの性別は何ですか?」などというトチ狂った話をしているわけではない。
これが、ほとんどコードが書かれていない状態では「list」などと正しく返ってくるわけだが、行数が増えてくるとこれが突如としてランダムな少数の値を返してきたりするようになる。
結果としてプログラムの書き換えを迫られるわけだが、理由がさっぱり分からない。
もしかして、値を設定するのに「set」命令は使うべきではなくcopy命令を使うべきなのかもしれない。値の代入にほとんどset命令を使うので、これが何か(理解不能な)トラブルをひきおこしているのかもしれない。
ほかにも、通常のAppleScriptのプログラムをAppleScript Studio環境のプログラムの中にコピ−&ペーストしただけで動かなくなるとか、いろいろと問題が多すぎる。
通常のAppleScript(スクリプトエディタ上で記述し、一般のAppleScriptのランタイムを持つもの)ではこのような現象には直面しない。本格的な開発環境であるXcode上で記述するAppleScript Studioよりも、スクリプトエディタ上で記述するAppleScriptのほうが、より安定して大きなプログラムを組むことができ、さらにいうなら生産性も段違いに高いのだ。