コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
Wikippe
検索
検索
表示
ログイン
個人用ツール
ログイン
静的スコープのソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
静的スコープ
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
要求した操作を行うことは許可されていません。
このページのソースの閲覧やコピーができます。
'''静的スコープ'''(せいてきスコープ、{{lang-en-short|static scope}})とは、[[プログラミング言語]]における[[スコープ]]の一種。構文構造のみから決定できるため'''構文スコープ'''<ref>{{lang-en-short|lexical scope}}</ref>ともいう。 ブロックなどの構造を持つプログラミング言語では、ある[[ブロック (プログラミング)|ブロック]]の内側で定義された変数はそのブロックの外側から操作することができないのが普通である。以下の疑似コードでは A { var x; } B { var x; // A内のxとは別物 C { var y; // Cの内側からしか見えない } } ブロック<code>A</code>で定義されている変数<code>x</code>とブロック<code>B</code>で定義されている変数<code>x</code>は同じ識別子を持つが、ブロックが異なるため実体は別である。また、ブロック<code>B</code>からは、さらに内側のブロック<code>C</code>で定義されている変数を参照することはできない。逆にブロック<code>C</code>からはブロック<code>B</code>で定義されている変数<code>x</code>とブロック<code>C</code>で定義されている変数<code>y</code>が参照可能である。 近代的なプログラミング言語では、コードレベルのブロックだけでなく、[[名前空間]]を導入してスコープを制限する機能が普及しつつある。静的スコープはプログラミングの安全性や、最適化が行いやすいなどの理由で[[構造化プログラミング|構造化言語]]を中心に広く採用されている。静的スコープでないものの代表は[[動的スコープ]]である。 == Common Lispにおける例 == Common Lispは、静的スコープと動的スコープを共にサポートする言語である。定められた方法で指定することで、変数を静的スコープにしたり、動的スコープにしたりすることができる。 <source lang="lisp"> (defvar *a*) ;; *a* を動的スコープで値なしで宣言する。 ;; アスタリスクは名前の一部である。 ;; defvarは、以降のそれに対する束縛が静的なものでなく、 ;; 動的なものである事を保証する。 (setf *a* 5) ;; 変数 *a* を整数 5 に設定する。 (let ((*a* 3)) *a*) ; --> 3 ;; 明示的にletの中で上書きされた場合、*a*は3 *a* ; --> 5 ;; letの外に出るともとに戻る (defvar func-lex) (setf func-lex (let ((a 3)) (lambda () a))) ;; 現在、静的スコープ内の3がlambdaの中に残っている ;; したがって、 (let ((a 5)) (funcall func-lex)) ; --> 3 ;; 外からaを書き換えて呼び出しても、 ;; 保存された静的な束縛 a = 3 がまだ残っており、 ;; それが有効になって答えは3となる ;; 一方、*a*について考えると、 (defvar func-dyn) (setf func-dyn (let ((*a* 3)) (lambda () *a*))) (funcall func-dyn) ; --> 5 ;; *a*は動的スコープの変数として宣言されているため、 ;; lambdaの中の *a* は常に ;; その時点での最も外側の変数を指すことになる。 ;; 静的スコープに束縛された *a* = 3 はlambdaの中に保存されない </source> == 脚注 == {{脚注ヘルプ}} {{Reflist}} == 関連項目 == * [[クロージャ]] {{DEFAULTSORT:せいてきすこおふ}} [[Category:プログラミング言語の構文]] [[en:Static scoping]]
このページで使用されているテンプレート:
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:脚注ヘルプ
(
ソースを閲覧
)
静的スコープ
に戻る。
検索
検索
静的スコープのソースを表示
話題を追加