列挙型

import std.stdio;
import std.conv;

enum Operation { exit, add, subtract, multiply, divide }

void main() {
    // サポートされている操作を表示する
    write("Operations - ");
    for (Operation operation;
         operation <= Operation.max;
         ++operation) {

        writef("%d:%s ", operation, operation);
    }
    writeln();

    // ユーザーが終了するまで無条件ループ
    while (true) {
        write("Operation? ");

        // 入力は、列挙型の実際の型(int)で読み込む必要がある
        //
        int operationCode;
        readf(" %s", &operationCode);

        /* この時点から、マジック定数の代わりに列挙型の値を使用する
         * ようになる。したがって、intで読み込まれた操作コードは、
         * 対応する列挙型の値に変換する必要がある。
         *
         *
         * (型変換については、
         * 後の章で詳しく説明する。) */
        Operation operation = cast(Operation)operationCode;

        if ((operation < Operation.min) ||
            (operation > Operation.max)) {
            writeln("ERROR: Invalid operation");
            continue;
        }

        if (operation == Operation.exit) {
            writeln("Goodbye!");
            break;
        }

        double first;
        double second;
        double result;

        write(" First operand? ");
        readf(" %s", &first);

        write("Second operand? ");
        readf(" %s", &second);

        switch (operation) {

        case Operation.add:
            result = first + second;
            break;

        case Operation.subtract:
            result = first - second;
            break;

        case Operation.multiply:
            result = first * second;
            break;

        case Operation.divide:
            result = first / second;
            break;

        default:
            throw new Exception(
                "ERROR: This line should have never been reached.");
        }

        writeln("        Result: ", result);
    }
}
D
enum.solution.1