このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

型解析:気分転換に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}} という形式は、オブジェクト型のワイルドカードとしても使っている。スター型を配列とオブジェクトで共通に使い、処理も共通にしようとしたが、実際にはそうなってない。


@person {
"handle" : string,
"name" : string?,
"job" : [string*]
}
Erlang表現は:

{tag, person,
{object, [
{"handle", string},
{"name", {opt, string}},
{"job", {array, [{star, {opt, string}}]}}
]}
}