型解析:気分転換にErlang
型を次の12種13種に分類する。
番号 | 型種別 | 旧構文 | 新構文 | Erlang | 備考 |
---|---|---|---|---|---|
1 | never型 | never | never | never | みんな同じ |
2 | any型 | any | any | any | みんな同じ |
3 | リテラル | JSONリテラル | JSONリテラル | Erlangリテラル | ほとんど同じ |
3.1 | 数値リテラル | JSON数値 | JSON数値 | Erlang数値 | ほとんど同じ |
3.2 | 文字列リテラル | JSON文字列 | JSON文字列 | Erlang文字列 | ASCIIに限れば同じ |
3.3 | true, false, null | JSONリテラル | JSONリテラル | アトム | - |
4 | スカラー型 | 名前 | 名前 | アトム | みんな同じ |
5 | 配列型 | array [...] | [...] | {array, [...]} | - |
6 | オブジェクト型 | object {...} | {...} | {object, [...Proplist]} | プロパティキーは文字列 |
7 | タグ(明示的タグ)付き型 | @α T | @α T | {tag, Tag, Type} | - |
8 | オプショナル型 | T? | T? | {opt, Type} | - |
9 | 排他的ユニオン型 | T1 | T2 | T1 | T2 | {xunion, [...]} | - |
10 | インターセクション型 | T1 & T2 | T1 & T2 | {inter, [...]} | - |
11 | ジョイン型 | T1 ∪ T2 | T1 ∪ T2 | {join, [...]} | - |
12 | 変数(不定型) | _Name | _Name | {'var', Name} | Nameはアトム |
* | スター(繰り返し)型 | T* | T* | {star, {opt, Type}} | ワイルドカードも同じ |
スター型(クリーネスター)は、配列の最後でだけ使えるもので、一人前の型ではない。{star, {opt, Type}} という形式は、オブジェクト型のワイルドカードとしても使っている。スター型を配列とオブジェクトで共通に使い、処理も共通にしようとしたが、実際にはそうなってない。
のErlang表現は:
@person {
"handle" : string,
"name" : string?,
"job" : [string*]
}
{tag, person,
{object, [
{"handle", string},
{"name", {opt, string}},
{"job", {array, [{star, {opt, string}}]}}
]}
}