だいぶやれるようになってきた. 前回色々言ったけど, 結局 jsonnet のように, まずデータ型や細かいデータの定義をつらつらと書いて, 一番最後に, 1つだけエクスポートするようなデータをまるでテンプレートを書くかのように書く, というスタイルになった. こちらのほうが単純に文法がキレイというのが1つ, 変数名が衝突するような場合のチェックが面倒(衝突する場合は variable hiding させたい)というのが1つ.
cumin/commit/d4015caf79e86acf45f4ce842218fb768ebc375a
こんなのが動く.
struct Point {
x: Int,
y: Int,
}
let p = Point(2, 3);
enum Z {
Z1, // Z is this,
Z2, // xor this.
}
let x = "hoge";
let y = "fuga";
let z: Nat = 0;
// 上書き!
let z = Z::Z2;
struct AllData {
p: Point,
z: Z,
str: String,
}
// Exporting this
AllData(p, z, x + y)
これについて cuminc
は次を吐く.
{
"p": {
"x": 2,
"y": 3
},
"z": "Z2",
"str": "hogefuga"
}
struct は辞書に変換されるし, +
は数値の加算または文字列結合として計算される. enum の扱いややや困るが当然 JSON にはプリミティブな型しかないので, 列挙子の名前そのママを文字列として吐くことにした.
まだまだ色んなものが足りてない
{{ x=1, y="hoge" }}
という文法を用意するX { field=val }
形式のコンストラクタ+
しかない次はやるか未定