このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

とても素敵なデータ表現言語(やや難あり)

JSONは便利なデータ表現なんだけど、

  1. 型情報が付加できない
  2. ハッシュのキーに引用符を付けるのがイヤ

という理由で(2番目はあまり本質的ではないけど)、JSON改(後でXionに改名)というデータ表現を提案しました*1

JSON:

{
 "familyName" : "板東",
 "givenName" : "トン吉",
 "age" : 27,
 "sex" : "male",
 "company" :
  {
   "name" : "(株)東西トラベル",
   "url" : "http://www.example.jp/tozai-travel/"
  },
 "hobbies" : ["盆栽", "釣り", "版画"]
}

JSON改(Xion):

Person {
 familyName : "板東",
 givenName : "トン吉",
 age : 27,
 sex : Sex "male",
 company :
  Company {
   name : "(株)東西トラベル",
   url : URL "http://www.example.jp/tozai-travel/"
  },
 hobbies : ["盆栽", "釣り", "版画"]
}

JSON改の表現では、Person, Sex, Company, URLがデータ型を示す識別子(型名、ソート)です。

実は既に、JSON改とソックリなデータ表現があるんですよね(すぐ下)。

@Person (
 familyName = "板東",
 givenName = "トン吉",
 age = 27,
 sex = Sex.male,
 company =
  @Company (
   name = "(株)東西トラベル",
   url = @URL("http://www.example.jp/tozai-travel/")
  ),
 hobbies = {"盆栽", "釣り", "版画"}
)

これは何かって? Javaのアノテーションです :-) 。単にデータインスタンスをリテラル表記できるだけじゃなくて、きっちりとスキーマ(データ型)定義もできるし、妥当性検証までしてくれます。まー、なんて素敵なんでしょ!

enum Sex {male, female}

@interface URL {
  String value();
}

@interface Company {
  String name() default "";
  URL url() default @URL("");
}

@interface Person {
  String familyName();
  String givenName();
  int age();
  Sex sex();
  Company company() default @Company();
  String[] hobbies() default {};
}

@Person (
 familyName = "板東",
 givenName = "トン吉",
 age = 27,
 sex = Sex.male,
 company =
  @Company (
   name = "(株)東西トラベル",
   url = @URL("http://www.example.jp/tozai-travel/")
  ),
 hobbies = {"盆栽", "釣り", "版画"}
)

public class Foo {
}

残念なのは、データ表現をクラスとかメソッドにひっつけないと使えないことです。それでもまー、名簿を次にように書けます。

public class People {
 @Person (
  familyName = "板東",
  givenName = "トン吉",
  age = 27,
  sex = Sex.male
 ) public void tonkichi(){};

 @Person (
  familyName = "大垣",
  givenName = "ペケ子",
  age = 21,
  sex = Sex.female
 ) public void pekeko(){};
 // 
 // ...
 //
}

クラスファイルがデータストレージになりますぜ。誰かリフレクションを使って、データノードをたどるDOM風APIと、検索をするSQL風問い合わせ言語を作ってくれませんかねぇ。