ループが最後まで回ったか

なぜかいまさら意識したのですが、forとかwhileが終わった後、「ループが最後まで回ったときだけ」の処理を書くことって非常に多い気がします。次のような感じ。

flag = false
for e in array do
  # ここでなんか処理
  if なんかの条件 then
     flag = true
     break
  end
end

if !flag then
  # ループが最後まで回ったときだけの処理
end

しかし、こういうコードは「美しくない」です。関数として次のように切り出して書いた方がいいよ派の人々が存在します。

def func()
  for e in array do
    # なんかの処理
    if なんかの条件 then
      return
    end
  end  
  # ループが最後まで回ったときだけの処理
end

「美しくない」というのはちょっと中2病ぽいですが、そうでもないです。状態変数(最初の例ではflag)を持たせると、プログラムを最適化したり検証したりする場合にデメリットがあります。また、関数化した方のコードはやはり可読性が高いです(そのかわり柔軟性は低いです)。

で、今日思ったことは、「ループが最後まで回りきったときだけ実行されるfinally的なブロック」をサポートしてる言語ってあってもよさそうだな、ということ。今のところメジャーな言語では、そういう機能はないですよね。あるのかなぁ?

もちろんこれはプリミティブな言語機能ではありません。しかし、このパターンでプログラムを書くことは大変多い。そうすると、現実的には、「ループが最後まで回りきったときだけ実行されるブロック」が明らかになることで、何かソフトウェアの静的解析や並列化、最適化などにおいてメリットがでたりしないかなぁと思ってしまうわけです。

でも、こういう話題って前世紀にひととおり研究されてるんですよね…。その結果として、計算原理主義的な人々が関数型言語に行き着いたのではないかという気もします。

やっぱプログラミング言語はよく分かりません。難しいです。