クエリ構文の拡張
現在のIrenkaのクエリは、2つのプレースホルダ間の制約関係について
- 同一である: U = V (UとVは同一の制約を負う)
- 同一なものを含む: U in V
の2つしか検証できない。
ということでrelationshipに関する演算子をいくつか新規提案。
identity, equivalence
- U == V
- UとVは同一 (element U is identical to element V)
- U != V
- U == V の否定
- U === V
- UとVは同値 (element U is equivalent to element V)
- U !== V
- U === V の否定
numerical
- U < V
- UはV未満 (numerical element U is less than numerical element V)
- U <= V
- UはV以下 (numerical element U is less than or equals to numerical element V)
type
string
- U =~ (R)
- Uは正規表現Rで表現できる
list
- U <== V, U in V
- UはVに含まれる (element U is in element list V)
- U <!= V, U ex V
- UはVに含まれない (element U is not in element list V)
推移変換
名前が適切じゃないかもですが、id:ashigeru:20070814:1187144732:titleで言及した「厳密な一致」を少し緩和するための変換について。
@Hoge @Foo @Bar int f;
というフィールドfから@Fooだけを取り出そうとする場合、現行では次のようなクエリが必要です。
/** * @when * foo in {@link #f}.annotations * foo.spec = {@link Foo} */
確かに@Fooという注釈の実体と、Fooという注釈の型は別物ですが、通常は同一視しちゃってもいいかなと思うことがあります。
同一性比較(==)や同値性比較(===)を行う場合に、このようなギャップを埋める処理として「推移変換」という機構を用意しようかなと思います。
つまり、
/** * @when * foo in {@link #f}.annotations * foo === {@link Foo} */
とか書くことによって、注釈foo(の型)が型Fooと同一であるというイメージです。
また、この辺の機能を入れると変数の宣言、シンボル、参照など、さまざまな形態について意識しないですむようになると考えます。
/** * @when * field == assign.leftHandSide * field === int */
下記、()の部分が推移変換によって補完された情報です
- fieldはassign.leftHandSide(の指すシンボル)と同一
- field(の型)はint型
かなり精査しないと破綻しそうではありますが、最終的にはこのようなことができればいいなと思います。