Case 式

case 式は、ラベル付き式の集合から評価する式を選択するときに使用します。この評価は、ラベルと比較されるテスト値に基づいて行われます。

テスト式とラベルがマッチする最初の式だけが評価されます。

すべてのラベルは、テスト式と比較できなければなりません。

ラベル付き式がブロック式である可能性もあるので、実行するコード ブロックから選んだ case 式をケース ステートメントとして使用できます。

   

<case_expr>構文を以下に示します。

case [ <expr> ]  of ( <cases> )

ここで、<expr> はテスト式、<cases> は一連のラベル付き式です。

<factor>: <expr>
default: <expr>   

例:

b = Box()
copy_type = 2 --copy
new_obj = case copy_type of
(
2: copy b
3: instance b
default: reference b
)

特殊ラベル default をオプションで使用することにより、他のラベルがテスト式にマッチしないときに評価される式にタグを指定できます。

default ラベルが使用されない場合は、テスト式にマッチするラベルがないため、 case 式は undefined を返します。

   

ラベルとは、数リテラル、名前リテラル、文字列リテラル、変数、またはブロック式などの要素 <factors> のことです。

case 式が評価されると、いったんテスト式が評価され、比較結果がテスト式の値に等しい式が見つかるまで各ラベル式が順に評価されていきます。

次にラベルが付く式が評価され、それが case 式全体の結果になります。

それ以降のラベルの評価またはテストは行われません。

   

テスト式はオプションです。

テスト式が提供されない場合、ラベルはすべてブール値か式であると予想され、 true に評価された最初のラベルが選択されます。

このバリアントではラベルを式として使用するのが一般的なので、次のように必ずラベルをカッコで囲んでください。

例:

a= random 1 20
b = random 1 20
c = random 1 20
d = random 1 20 
case of
(
(a > b): print "a is big"
(b < c): print "b is little"
(c <= d*3): print "c is less than 3 times d" 
default: print "none of the above"
)