トグル(ON/OFF)処理

真偽値を使う

 ONとOFFを交互に繰り返す処理を書きたい場合が少なからずありますが、多分一番基本的なのは、真偽値を使う方法です。
 変数の中身が真ならば偽に、偽ならば真に変えて、それぞれの処理を行います。

set theBoolean to true

repeat 10
	if theBoolean = true then
		display dialog "表"
		set theBoolean to false
	else
		display dialog "裏"
		set theBoolean to true
	end if
end repeat

 たぶん、以上のようなスクリプトを書くのでは無いかと思いますが、これならば、表か裏かを記録しておく変数の値は、別に真偽値である必要もありません。
 ですが無駄な部分を省くと、以下のように書けます。詳しくは「判定文と真偽値」の項を参照してください。

set theBoolean to true

repeat 10
	if theBoolean then
		display dialog "表"
	else
		display dialog "裏"
	end if
	set theBoolean to not theBoolean
end repeat

「set theBoolean to not theBoolean」は、トグル処理の基本です。

正負を反転する

 真偽値を逆転させることと良く似た処理として、数値の頭に負の記号をつけて、正負を逆転させる方法があります。
 これを利用して、先ほどのスクリプトを書き換えてみましょう。

set theNum to 1

repeat 10 times
	display dialog item (2 + theNum) of {"裏", "ダミー", "表"}
	set theNum to - theNum
end repeat

 先ほどのスクリプトと良く似ていますが、表示のところでリストを利用することによって、さらに短くかけました。
 if文を使っていないので、ちょっとスクリプトが理解しづらいのが難点ではありますが、数字を引数に利用する命令は非常に多いので、数字を使った方が何かと応用範囲が広がるということはあります。
 例えば、二つの項目を持ったリストの場合、最初の項目はitem 1であると同時にitem -2でもあります。
 このあたりを利用する手もあります。

set theNum to 1

repeat 10
	display dialog item theNum of {"表", "裏"}
	set theNum to - theNum
end repeat

 "表"が1、"裏"が-1になります。これだとダミーを入れることも無くて、格好がいいですね。
 ちなみに、初期値に2を入れると、"表"が-2、"裏"が2になりますから、それでもちゃんと動きます。

数値の合計を使う

 初期値を0.5に設定して、「item (0.5 + theNum) of {"裏", "表"}」とする手もありますが、実数を使うのもあまり格好よくありません。
 このような、2つの数値を交互に繰り返す処理は、そこそこ必要になる処理です。
 簡単な足し算と引き算の組み合わせですが「2つの数値の合計から、現在の数値を引く」と、もう一つの数値が得られると言うことを利用して、スクリプトを書き換えます。

set theNum to 1

repeat 10
	display dialog item theNum of {"表", "裏"}
	set theNum to 3-theNum
end repeat

 if文を多用すれば、大抵どうにかなってしまうのですが、これらの方法を使い分けると、よりスマートなスクリプトが書けるようになるでしょう。
 if文を多用すると、実行スピードが落ちたり、インデントが深くなってスクリプトが見にくくなるデメリットもあります。
 あまりif文にばかり頼るのも考えものでしょう(if文を嫌いすぎるのもいけませんが)
 ついでに、8と15を交互に表示するスクリプトを作ったので、参考にしてください。

set theNum to 8

repeat 10
	display dialog theNum
	set theNum to 23-theNum
end repeat

 8+15=23ですから、そこから現在の値を引いているというわけで、簡単な理屈です。

3種類以上の項目を繰り返す

 二つのものならば、以上のような感じで、だいたい大丈夫だと思いますが、3つ以上のものとなると、まともにやると以下のようになります。

set theNum to 1

repeat 10
	display dialog item theNum of {"アン", "ドゥ", "トロワ"}
	if theNum = 3 then
		set theNum to 1
	else
		set theNum to theNum+1
	end if
end repeat

 modは整数を割った余りを求める演算子ですから、例えば3で割ると、答えは0,1,2の三種類のいずれかの数値になります。
 これを利用してスクリプトを書き換えてみました。

repeat with i from 1 to 10
	display dialog item ((i mod 3) + 1) of {"トロワ", "アン", "ドゥ"}
end repeat

 同じ理屈で、さらにスクリプトを書き換えました。
 nが0,1,2を繰り返します。

set n to 0
repeat with i from 1 to 10
	set n to (n + 1) mod 3
	display dialog item (n + 1) of {"トロワ", "アン", "ドゥ"}
end repeat

レインボーファイル

 応用編として、ファイルに7色+無色の8つラベルを順につけていくスクリプトです。
 Finderで処理したいファイルを選択した後、実行します。

tell application "Finder"
	set theList to selection
	
	repeat with i from 1 to number of theList
		set label index of (item i of theList) to i mod 8
	end repeat
end tell

[2000-03-05 -2000-06-04 -2001-06-25