クロージャ

[id:m-hiyama:20070523:1179888512]
はてなのキーワードにクロージャを登録した本人です。(駄洒落は私の仕業ではありません)
クロージャってバズワードですよね。なので、人によって使い方がまちまちなような気がするのですが、プログラミング言語の機能としての意味における伝統的な(と私が理解している)クロージャの意味についてという注釈付きですという前置きをおいて。
あと、クロージャといえば、今ではレキシカルクロージャのことがほとんどなので、そっちに限定します。
キーワードの説明を書いたり、当ブログで昔クロージャの意味に付いて盛り上がったりしたころから比べると、だいぶ知識が深くなったので、もう少しましな説明になることを祈りつつ・・・

      • -

ラムダ式に含まれる自由変数をどのように扱うかという問題で、その自由変数を字句上での環境に束縛して取り扱うことや、そのルールの元に生成された式のことを、クロージャと呼ぶということだと思います。
現実のプログラミング言語では、ラムダ式が手続きになったり関数になったりオブジェクトになったりモジュールになったりしますし、変数が束縛される対象も数値やら文字列やら関数やらオブジェクトやらモジュールやら型やらになったりするわけですが、いずれにせよ、自由変数が字句上の環境に束縛されているかというところがポイントです。
ところで、よくある誤解ですが、クロージャが実装上も「関数+環境」になっている必要は全くないです。これは、shiroさんのhttp://www.itmedia.co.jp/enterprise/articles/0703/30/news051_2.htmlに実例付きで説明されています。
ということで、以上の説明をまとめると、クロージャとはレキシカルスコープと同じことを別の言葉で表現していることだということになります。

      • -

なので、

function makeAffineLinear(a) {
 return function(x) {
  return a*x + b;
 }
}

クロージャかどうかは、これだけでは判断できなくて、処理系がどのように扱っているか次第です。
また、式の内部に自由変数を含んでいるかどうかも、クロージャとは関係ないように思います。

      • -

そもそも、これが何でクロージャと呼ばれるようになったかについては[id:lethevert:20060127:p1]をみるとよいかと思います。