AppleScriptのcontinue

AppleScriptは、Macユーザかつスクリプトを常用している人間でないと使わないので、マイナーなアプリではありますが、その能力はあなどれません。私の自作ツールのほとんどはAppleScriptベースですが、業務の生産効率を左右するほどの影響力があります。

ただ、AppleScriptに何も不満がないわけではなく、こんなのがあるといいのにな‥‥と思う機能はそこそこあります。すごく基本的なところではループ文における「continue」です。

AppleScriptでも「continue」はあるのですが、「処理を続ける」という命令で、ループの処理を抜けて次回へスキップする内容ではありません。JavaScriptのcontinue相当はどうもAppleScriptには存在しないようです。breakはexitでイケるんですが。

要は、処理を抜ける構造が実現できれば良いので、以下のようにしてcontinueと同等の動作は実現できます。

set myList to {}
repeat with i in {1, 2, 0, 15, 2, 2.1, 2, 3}
    repeat 1 times--continue実現の為のrepeat
        set i to i as number
        if i = 2 then exit repeat
        set myList to myList & i
    end repeat
end repeat
return myList
--結果は{1, 0, 15, 2.1, 3} 
〜変数「i」が2の時はexit(break;)して、以降の処理はスキップします

入れ子のrepeat上でexitを使えば、exit以降の処理は実行されずにスキップされるので、continueと同じ働きをします。

しかしなんでしょ‥‥、行儀は悪いですよね。continue実現のために、repeatを本来とは違う目的で用いているのですから。

インクリメントとかは、単に「set i to i+1」とやればよいので、文字数の冗長さにガマンするだけで済むんですが、continue模倣の為だけにrepeatを使うのは、後になってコードを読み返した際に「何でここでrepeatを使ってるんだ?」と自分でも判らなくなりそうで、面倒でコワいです。

ちなみに‥‥。参考文中の「set i to i as number」を読んで、「なぜ、そんなクドいキャストを?」と思う人もおられるかもしれません。変数 i には当然Numberクラスが代入されていると思うわけですが、その変数 i を「is」「=」の比較演算子を用いて評価すると、実際はうまくいかないのです。AppleScriptにはありがちな動作ですネ。「item 2 of {1,2,3}(つまり2ですネ) 」は、2ではない‥‥という比較演算‥‥。でもまあ、もう16年もAppleScriptと付き合ってると、他の言語にはないクセもお馴染みなので、もはや混乱する事はあまりないです。AppleScriptが「何でヘソを曲げているのか」は大体察しがつきます。しかし、JavaScriptなどの他の言語に慣れた人がAppleScriptを使うと、「???」の連続かも知れませんネ(苦)。

関連する記事

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>

selected entries

categories

archives

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM