並列なのにネスト

プログラミングの基本は入力と出力である。最近のプログラミング言語ではオープンしたファイルを閉じ忘れたりすることが無いように、ある種のルーチンの塊を抜けると自動的にクローズする機能をもっている場合が多い。
C++ならデストラクタで閉じるし、Rubyならブロックを使う。私はC/C++をメインで使うのでRubyを使うと感覚的に戸惑うことがある。あるファイルの内容を処理した結果を別のファイルに書き出す処理はありがちなものだが、入力と出力は並列の関係にあるものだと思っているので、どちらかがもう一方をネストするのが不自然に思えてしまうのだ。たとえば単純にファイルのコピーをするコードを書こうとすればこうなってしまう。

open(outfilename){|out|
  open(infilename){|in|
    out.write(in.read)
  }
}

あえて入力と出力の従属関係を決めるならば、意味においてユーザに必要なのは出力であるので、入力は出力のために必要な処理と考えることができる。と、自分を納得させているが、もっとマシな意味論を構築することが出来るだろうか?