Tue Nov 10 2020

cumin 開発日記

だいぶやれるようになってきた. 前回色々言ったけど, 結局 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 にはプリミティブな型しかないので, 列挙子の名前そのママを文字列として吐くことにした.

ロードマップ

まだまだ色んなものが足りてない

次はやるか未定