# Blog消失前の投稿を再構成して「たぶんこんな内容」と推測して投稿したものです
AppleがOSに添付しているサンプルAppleScriptは内容がひどいという評判で、内容を見ると実際に仕事でAppleScriptを書いている連中も読むのが嫌になるという、ひどい見本でした。
「AppleがOSに添付しているサンプルのように書かないことが上達への近道だ」
「あのひどい内容のScriptを添付しているのは害悪以外の何物でもない」
といえるほど。さすがに批判も多かったのか、最悪の時期のサンプル(Mac OS X 10.5)のものは削除されましたが、この最悪の時期のサンプルを見てそのままコピペで書いた内容がひどかったので、そのもっともひどい部分を掲載。「絶対にこう書いてはいけない」という見本として示します。
出典「AppleScript最新リファレンス」
結果が代入される暗黙の変数、result
–Replace Text In Item Names
–Copyright © 2001–2007 Apple Inc.
display dialog "Search and replace in:" buttons {"File Names", "Folder Names", "Both"} default button 3
set the search_parameter to the button returned of the result
★Click Here to Open This Script
AppleScriptは行単位で順次実行されますが、その行単位の実行結果はつねに「result」というシステム変数に入ります。
よほどトリッキーなプログラムでもないかぎり、resultが活躍する場面というのはほとんどありません。まして、前の行の計算結果をresultを介してやりとりすると、何をどう処理しているのかさっぱりわからなくなるので、「使わないほうがよいもの」として世間一般のScripterから避けられています。
それを、Mac OS X 10.5などという割とアップデートが一段落してMac OS Xの世界観が定着してきた頃になって引っ張りだしてきたので、Scripter連中は驚いたわけです。
参照渡しでもないのにサブルーチンの末尾で何もreturnで返り値を指定していないのにサブルーチンの処理結果がメイン側に戻るような場合には、この暗黙のresultの内容が戻っています。
最悪最低! recordの内容をlistに変換して取り出した
display dialog "TEST" default answer "AAA"
などと書いて実行すると、
{button returned:"OK", text returned:"AAA"}
のような結果が返ってきます。これらは、属性ラベルを指定して取り出すのですが、このAppleのサンプルでは、こともあろうにこの結果をlistに変換して処理していました。
–Replace Text In Item Names
–Copyright © 2001–2007 Apple Inc.
tell me to display dialog the error_message default answer new_item_name buttons {"Cancel", "Skip", "OK"} default button 3
copy the result as list to {new_item_name, button_pressed}
★Click Here to Open This Script
これを見た初心者が、「AppleScriptのdisplay dialogの結果が毎回変わって取得できない」などと騒ぐ始末。recordなので、属性ラベルの登場順は保証されていない(むしろ、そんなもん毎回変わって当然)ものですが、それをrecordから属性ラベルを指定して取り出すのではなく、list(配列)に変換して順番に応じて結果を取り出そうとしたので「毎回変わる」などという話になったのでした。
これは、100% Appleのサンプルスクリプトが悪いですし、こんなものを標準添付している連中の気が知れません。サンプルスクリプトとしては史上最低最悪のレベルと呼んで差し支えありません。
それぞれ、recordから値を取り出す場合には属性ラベルを指定して取り出すというのがセオリーです。
set aRes to (display dialog "TEST" default answer "AAA")
–> {button returned:"OK", text returned:"BBBBB"}
set buttonRes to button returned of aRes
–> "OK"
set textRes to text returned of aRes
–> "BBBBB"
★Click Here to Open This Script