JSON改2
やっぱり多少の変更は必要だな、とはいっても互換の範囲でできる。
まずはコンベンションの追加:ドル記号からはじまるプロパティ名は特殊目的なので、ユーザーレベルでは使えない、とする。アプリケーションは、知らないドルマーク・プロパティが出てきたらそれはないものとして扱う。つまり、ドル記号ではじまるプロパティはアプリケーションからは見えないし、万が一見えても見てはいけない。
それで、"$case" をタイプタグを入れるフィールドとして使う。"$case" の値はstringまたはinteger。"$val"と一緒に使う。
- "$case" があれば、それはキー付きユニオン型のデータとみなす。
- "$val" があれば、"$val"の値を値として採用する。
- "$val" があるときは、"$val"以外のプロパティはすべて無視される。
- "$val" がないときは、"$case" を取り除いたオブジェクトを値とみなす。
スキーマ側の変更としては、単なるユニオン型は認めないで、キー付きユニオンだけを認める。union {...} という形で定義する。
テンプレート側でも、
とか入れたほうがいいかも。Erlang同様、選択肢からはみ出したら例外が起きる。たぶん、これで整合的だと思う。
{case}
{when foo} ...{endwhen}
{when bar} ...{endwhen}
{endcase}