ASONはAltScript Object Notationの略で階層型のテキストベースのデータ交換フォーマットです。
公式サイトには以下のようなASONの例が載っています。
user-database: [
{
name: "John Smith"
age: 22
born: 1998-8-15
usage: 8:22:45
email: jsmith@altscript.com
website: http://altscript.com
version: 3.2.14
passhash: #A94A8FE5CCB19BA6
colors: [ 255.100.50 50.50.80 ]
allow: [ login admin upload edit ]
check: [ if age > 60 [ add-to people.seniors ]]
}
{ ... more users ... }
]
一見するとJSONのような構造を持っていますが、以下でJSONとの違いについて説明していきます。
データ型
JSONは以下のデータ型をサポートしています。
- ブール値
- 整数
- 浮動小数点数
- 文字列
しかし、これ以外のデータ型が必要な場合は文字列として記述して、JSON読み出すプログラム側でパースする必要があります。時刻を文字列型で表現するケースが良く見かける例です。
ASONは上記のデータ型に加えて以下のデータ型もサポートしています。
- シンボル
- 日付
- 時刻
- 通過
- バージョン
- メールアドレス
- ネットワークアドレス
- HTMLタグ
- 16進数
- バイナリ(Base64形式)
これにより文字列型の値をパースしてデータ型を変換する処理をASONパーサーに任せることができます。
カンマ
JSONではカンマで要素を区切っていましたが、ASONでは空白で区切ります。
これは見た目がスッキリする以上の意味を持つようです。
ASONはデータを表現するだけではなく、後述するシンボルを使うことでコードを表現することも考えられています。
空白で区切るような仕組みにすると、このコードとしての表現が通常のプログラミング言語のような見た目にできるのが大きな利点です。
例えば、以下がJSONでコードを記述した例で、
[ "if", "time", ">", "10:30", [ "signal", "wakeup" ] ]
以下がASONでコードを記述した例です。
[ if time > 10:30 [ signal wakeup ] ]
ASONの方が一般的なプログラミング言語に似た雰囲気なことが分かります。
シンボル
ASONではシンボル型を利用できるのが大きな特徴です。
Lispにおけるシンボル型のようなものだと考えるとイメージしやすいです。
シンボルはシンボルテーブルに格納されることで整数のような単純な値に変換されます。これによって文字列型よりも高速に比較演算ができます。
しかしシンボル型の真価は比較の高速化ではなく、シンボルに意味を与えるために使用することだそうです。
例えば以下のASONにはprintというシンボルが使われています。このprintに関数(典型的には画面出力処理など)を割り当てることができます。
[ print "Hello" ]
この他にも if
や >
などのシンボルにも同様に処理を割り当てることで、ASONを単なるデータフォーマットとしてだけではない使い方もできます。
これ以上は具体例がなかったので推測になってしまうのですが、テンプレートエンジンやLisp処理系のようなものに発展していく構想があるのだろうと思います。
実際に以下のロードマップを見るとこの様に書かれており、コード形式のASONを処理するインタプリターを作ることが示唆されてます。
AltScript — A high-performance interpreter for ASON code including standard functions for all datatypes, support for network connections, file I/O, encryption, compression, and more.
具体的な実装はまだないですが、データとコードの両方を同じフォーマットで表現するという発想は個人的に面白いと感じました。