レイフィケーションとは何かを超大雑把に書いてしまうと、プログラミング言語においてランタイムの領域にない何かをランタイムの領域に落とし込むこと。例えばあるOOPLにおいてインスタンスの生成元であるクラスを実行時に操作可能なクラスオブジェクトに落とし込めるのなら、それはクラスのレイフィケーションといえる。もっと低いレイヤーに移るなら、Cでメモリを直に弄るとかもその一種。
Catyにおけるレイフィケーションというのは、例えば型やコマンドなどのXJSON領域外の物をXJSONに変換することになる。つまり以下のような型定義に対して:
/**
* ドキュメント
*/
@[foo("bar")]
type someType<X, Y> = {
"a": string,
"b": integer,
"x": X,
"y": Y,
*: any?
};
以下のようなXJSONを吐き出すということ。
@type {
"typeParams": [
@_typeparam {
"default": null,
"kind": null,
"var_name": "X"
},
@_typeparam {
"default": null,
"kind": null,
"var_name": "Y"
}
],
"typeBody": @_object {
"items": {
"a": @_scalar {
"typeArgs": [],
"options": {},
"name": "string"
},
"x": @_scalar {
"typeArgs": [],
"options": {},
"name": "X"
},
"b": @_scalar {
"typeArgs": [],
"options": {},
"name": "integer"
},
"y": @_scalar {
"typeArgs": [],
"options": {},
"name": "Y"
}
},
"options": {},
"wildcard": @_optional {
"body": @_scalar {
"typeArgs": [],
"options": {},
"name": "any"
},
"options": {}
}
},
"docstring": "ドキュメント\n",
"name": "someType",
"annotation": @annotation [
{
"name": "foo",
"value": "bar"
}
]
}
レイフィケーションができるということは、プログラムそれ自身から自身が何者かを知ることができるということだ。モジュールの一覧やコマンドの一覧をCatyScriptから扱えるようになれば、例えばファイルIOなど外部環境に変更をもたらさないコマンドに対してランダムデータを大量に突っ込んで正常に動くかのテスト(=ファジング)ができる。
またモジュールなどのそれまで手の届かなかったオブジェクトがCatyScriptのデータ領域に存在するということは、あるモジュールが必要なコマンド・型・アクションを定義しているか、CatyScriptのみで実装されたコマンドのみを定義しているかなどの検証を言語の拡張一切なしにCatyスキーマの枠組みでできるということになる。