repeatで使用したカウンタをスクリプト中で書き換えても、ループに変化は起きません。
次のスクリプトでは途中でカウンタの値を書き換えていますが、何ごとも無かったようにループは続きます。
言語によっては、これでループを脱出することもありますが、AppleScriptではそのような事は起きません。
repeat with i from 1 to 100
display dialog i
set i to 100
display dialog i
end repeat
たとえば、次のようにrepeatの引数に計算式などをおくと、ループのたびに計算がおこってしまい、効率が落ちるのでは無いかという心配がありますが(細かいところを気にしすぎって話もある)
以下のスクリプトを見て分かる通り計算は一度しかおこなわれず、ループの範囲は記録されています。
repeat with i from 1 to (text returned of (display dialog "" default answer "5")) as integer
display dialog i
end repeat
ということは、範囲を指定するのに使われている変数をループの途中で書き換えてもループの回数には影響は無いということです。
以下のスクリプトは2〜4までのループを行い終了します。
set x to 2
repeat with i from x to x*2
display dialog i
set x to i
end repeat
次のスクリプトを実行すれば分かりますが、カウンタはループ範囲の最後の値となります(この場合5)
repeat with i from 1 to 5
end repeat
i
このことを利用すると、repeatの途中で抜け出した場合の数を調べる事もできます。
次のスクリプトは、50〜100の間で、24で割り切れる最初の数を調べます。
modZero(24)
on modZero(n)
repeat with i from 50 to 100
if i mod n = 0 then exit repeat
end repeat
return i
end modZero
ループの条件が既に満たされていたときに、ループの内部は実行されるのでしょうか。
次の場合は、既に初期値が終了値を超えていますから、ループの内部は実行されません。
repeat with i from 1 to 0 -- 1だと1回通る
display dialog i
end repeat
次の場合は、リストに値が1つもありませんから、ループの内部は実行されません。
repeat with curItem in {}
display dialog "Hello!"
end repeat
次の場合も、既に条件を満たしているので、ループの内部は実行されません。whileの場合も最初からfalseになる条件が与えられた場合、内部は実行されません。
repeat until true
display dialog "Hello!"
end repeat
次の場合もループの内部は実行されません。ちなみに負の数の場合も実行されません。
repeat 0 times
display dialog "Hello!"
end repeat
つまり全てのループで、条件が満たされている場合一度も実行されずにループは終了するということになります。
なお、repeat with〜in〜型のループの基本的な性質については、別に「repeat with〜in〜の性質」に詳しく述べたので、そちらも参照して欲しい。