ループの基本

カウンタの性質

 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〜の性質」に詳しく述べたので、そちらも参照して欲しい。


2000-07-02 -2000-08-05