Control Flow Constraint

下のプログラム、ちょっとしたバグがあります。

public void read(String name, String enc) throws IOException {
  Reader r = new InputStreamReader(new FileInputStream(name), enc);
  try {
    ...
  }
  finally {
    r.close();
  }
}

ファイルを確実に閉じるには、下記のように書かなければなりません。

public void read(String name, String enc) throws IOException {
  InputStream in = new FileInputStream(name);
  Reader r;
  try {
    r = new InputStreamReader(in, enc);
  }
  catch (IOException e) {
    in.close();
    throw e;
  }
  try {
    ...
  }
  finally {
    r.close();
  }
}

で、このルールを美しく書けるクエリが欲しい。

  • ストリームを開く式の評価結果は、次のいずれかとして同一フレーム内で利用されなければならない
    • s.close()呼び出しのs
    • new Hoge(...)の実引数 (上の例ではFileInputStreamはInputStreamReader#close()経由で呼ばれる)

これ、まとめてみると「ある式の評価結果は、次のいずれかとして利用されなければならない」っていうのだけ書ければ、他は従来のクエリ言語で書ける感じだ。

要は、その語彙だけ増やせばいいのかな?引き続き考察。