クエリ構文の拡張

現在のIrenkaのクエリは、2つのプレースホルダ間の制約関係について

  1. 同一である: U = V (UとVは同一の制約を負う)
  2. 同一なものを含む: 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

  • U <: V
    • UはVのサブタイプ (type U is a subtype of type V)
  • U << V
    • UはVに代入可能 (type U is assignable to type V)

string

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
 */

下記、()の部分が推移変換によって補完された情報です

  1. fieldはassign.leftHandSide(の指すシンボル)と同一
  2. field(の型)はint型

かなり精査しないと破綻しそうではありますが、最終的にはこのようなことができればいいなと思います。