レキシカルスコープとレキシカル変数とクロージャと
プログラミングの用語はどうも意味があいまいで、正確には何を指すのかいつも悩んでしまう。
【 目次 】
クロージャにはレキシカルがかかわっていて
クロージャについて調べていてレキシカルという言葉が出てきて、ひっかかってしまっていろいろと調べてみた。
例によって、他のサイトの引用ばっかりで恐縮だが。
- クロージャ - Wikipedia
自由変数が、その呼び出しにおけるエンクロージャのその名前の変数を、レキシカルに参照するのがクロージャであり、実行時に外部の関数が実行された際、クロージャが形成される。クロージャは内部の関数のコードとエンクロージャのスコープ内の必要なすべての変数への参照からなる。 クロージャはプログラム内で環境を共有するための仕組みである。レキシカル変数はグローバルな名前空間を占有しないという点でグローバル変数とは異なっている。
クロージャの外側の関数をエンクロージャと言うのか。
- [JavaScript]クロージャについての現在の理解 - Qiita
クロージャとは。
- 関数を入れ子にする
- 外側の関数をエンクロージャ、内側の関数をクロージャと言う
- エンクロージャはクロージャへの参照を返す
- この参照を保持することで、関数呼び出し時のコンテキストがメモリ上から解放されないようにする
- これによりエンクロージャ内で定義した変数が永続化される
- ただしエンクロージャ内に定義した変数にアクセスできるのはクロージャのみである
- コンテキストはエンクロージャの呼び出し毎に異なる
クロージャについては既に進撃の関数型プログラミングでも述べているのだけれども。
レキシカルスコープ(静的スコープ)とダイナミックスコープ(動的スコープ)
レキシカルスコープは静的スコープ(static scope)とも構文スコープとも言うらしい。
そして、レキシカルスコープ(静的スコープ)の対義語として動的スコープというものがある。
lexicalの意味は「(特定の著者または一国語の)語彙(ごい)の.」とかいう意味らしいがこれでは何の事かちっともわからない。
レキシカルには文脈上のという意味があって、レキシカルスコープを日本語訳すると構文スコープとなるようだ。
ダイナミックスコープのようにどこから呼び出されたかで変数のスコープが決まるのではなく、
文脈上(あるいは構文上)の位置(変数の定義位置)によってスコープが決定されるスコープという意味のようだ。
Perlのmyとlocalの違いをみてみると、レキシカルスコープとダイナミックスコープ違いがわかってくる。
- my と local どう違う? - futomi's CGI Cafe
ある範囲だけで有効になるよう変数を定義することを、局所化と言います。そして、局所化された変数のことをローカル変数と呼びます。ちなみに、スクリプトのどこでも有効になる変数のことを、グローバル変数と呼びます。
...
my を使って定義された変数は、レキシカルスコープ変数 と呼びます。そして、my を使って変数を宣言することをレキシカルスコープ宣言と呼びます。
...
local を使って定義された変数は、ダイナミックスコープ変数 と呼びます。そして、local を使って変数を宣言することをダイナミックスコープ宣言と呼びます。
スコープチェーンという言葉もあって「関数内に変数が見つからなかった場合、外側のスコープに変数を探しにいく」事を言うようだ。
JavaScriptやpythonなどの一般的な言語はレキシカルスコープを採用していて、ダイナミックスコープを採用している言語は少ないようだ。
そして、上記のmyとlocalのように両方のスコープが使えるPerlのような言語もある。
スコープと名前空間
ここでいまさらながら、プログラミング言語におけるスコープとは
変数のスコープとは変数の有効範囲という事か。
他にも、スコープにはクラススコープだとかインスタンススコープだとかいろいろあって、
インスタンススコープにはインスタンス変数やインスタンスメソッドが、
そしてクラススコープにはクラスメソッドやクラス変数が。
名前空間(namespace)とは
名前空間とスコープとは同じ意味で使っていたけど、
スコープ領域を名前を付けて区割りしたのが名前空間なのかな。
名前を付ける事で、名前空間をネストして階層化したりといろいろ複雑にスコープを区割りしたりと...
無名の名前空間なんてのもあるけど。
クロージャとレキシカルスコープ
- 実際簡単なレキシカルスコープとかクロージャとかそういうの - タオルケット体操
レキシカルスコープを採用している言語(つまり現代のほとんどの言語)は、この高階関数 を使う時に、上のスコープの変数を参照して、それを束縛することが出来ます。
クロージャを実現するには、レキシカルスコープが採用されていないといけないらしい。
- JavaScriptを学ぶ上で避けては通れないレキシカルスコープ - 大人になったら肺呼吸
レキシカルスコープ(静的スコープ)とそれを利用したクロージャという仕組み
レキシカル(スコープ)変数とは
- myの説明 'PERL-LABO'
レキシカル変数とは、局所的にのみ有効になる変数のことです。 myのあるブロック({}で囲まれた部分)内のみでその変数は有効になります。
レキシカルスコープにおける局所変数(ローカル変数)をレキシカル変数といって、 関数をネストさせてクロジャ関数を定義するとレキシカル変数の中にも自由変数と束縛変数 の区別が生じるという事かな。
支離滅裂で、なんだか、まとまりのない記事になちゃったけど、
ま、いいか