switch (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

シグネチャ

{switch value [complete] [using compare]
 [case e1 do statements]
 [case e1, e2 do statements]
 [else statements]
}

単一の式と、複数の可能な一致の比較に基づいて、コード ブロックに実行をスイッチします。

説明

最初の case 句に含まれている e1 のケースの時の statements を実行します。それは compare で指定された機能 (既定では == です) を使用して value と一致したケースとなります。case 句と一致するものが無い場合は、elsestatements が存在する場合、実行されます。value 式は 1 度だけ評価されることが保証されています。つまり、ケース式を比較する毎に実行されません。
complete キーワードは value のコンパイル時の型が 列挙型 の時にのみ使用できます。このような場合、case の記述で型が省略されている要素がある場合エラーが発生します。
value のコンパイル時の型が列挙型の時、EnumType.element-name を使用することで列挙型要素を完全に指定することに加えて、"element-name" の文字列を使用することで単に要素を指定できます。以下の例を参照して下さい。
value のコンパイル時の型が数値型、文字型、列挙型、String 型、using 句が指定されていない、全ての case 式がコンパイル時に定数の時、ほとんどの比較がスキップされるため switch は効率的な結果となります。そうでないなら、switch 式は if / elseif 式の挙動とパフォーマンスと同等となります。

戻り値

switch 式は通常、else 句を含んでいるか、全ての case 句が値を生成する時のみ値を生成します。そうでなければ (throwerror 構文を使用して) 例外をスローします。値は実行された句の最後の式から得られた結果になります。
value 式が 列挙型 で case が全てのとりうる値をカバーする場合、 switch 式は else 句を含まなくても値を生成します。

このサンプルは列挙型での swicth 構文を使用しています。
  • 全ての値を制御することを保証するために complete キーワードの使用。
  • 文字リテラルを使用した列挙型の値を指定する機能。
  • 全ての値について制御する場合、else 句を使わないで列挙型の swicth 式で値を生成する機能。

例: 列挙型の switch 式
{define-enum public E a, b, c}

{define-proc {e-switch e:E}:String
    {return
        {switch e complete
         case E.a do
            "a"
         case "b" do
            "b"
         case E.c do
            "c"
        }
    }
}

{e-switch E.b}
using 句を含むさらに多くの例や詳細については、『Curl 開発者ガイド』の 条件式の構成 を参照してください。

改訂

以下の機能が Curl 7.0 で追加されました。
  • complete キーワード。
  • 文字リテラルを使用して列挙型の値を指定する機能。
  • 列挙型で complet switch において else 句の省略。
  • 一部の switch でより効率的なコード生成機能。