昨日のSQLつづき

昨日の埋め込みについての話はびっくりするほどまとまっていなかった.

それとは別にやりたいこと:

 SQL s="select a,b from Product";
 for (%rec : s) {
   print "   a=#{s.a}  b=#{s.b}  \n";
 }

ってやると,クエリの結果を表示する.ここまではあたりまえ.

しかし

 SQL s="select a,b from Product";
 for (%rec : s) {
   print "   a=#{s.a}  b=#{s.c}   \n";
 }

と書くと"c はありません" とコンパイルエラーになってほしい.

これには,コンパイル時にselect文の中を精査して,aとb しかないことを検出しておかなければならない.

 class SQL implements Iterable {
   SQLField[] flds; //  "select XXXX..." に書いてあるフィールドが配列で入る
   SQL (StringConst expr) {
          parse(e.getString());
          T=new Class();
          for (%f: flds) {
              T.addField(f);
          }
   }
   Iterator iterator() { ...}
 }

つまり,SQL s="文字列" とあるとき,文字列定数を解析してSQLオブジェクトを作り,
さらにSQLの型Tをコンパイル時に捏造しまおうというもの.

上の例だと, a,b というフィールドを含んだクラスが捏造されて,Tに代入される.