2006年06月17日

レキシカルスコープ(lexical scope、静的スコープ、構文スコープ)・ダイナミックスコープ(dynamic scope、動的スコープ)

スコープとはバインディングの有効範囲です。
Schemeは静的スコープです。または構文スコープ、レキシカルスコープともいいます。

()の外側から内側のバインディングを参照することができません。
()の内側から外側のバインディングを参照することはできます。

#いろいろ間違ってる…。訂正を書きます。2008/02/15

(define a 100)

(define bar
(display a))

(define foo
(let ((a 10)) bar))

(foo)->100
関数手続きfooから呼び出されている関数手続きbarではaはグローバル変数のaを参照しています。
関数手続きfooで作成された変数aのスコープはfooの記述範囲のみ。

※動的スコープ、またはダイナミックスコープ
Emacs Lispはダイナミックスコープ
(foo)=>10

ダイナミックスコープでは関数手続きbarは、呼び出し元関数手続きfooでのaを参照している。

VBとかCとかC#とかもろもろはダイナミックスコープ
たとえばJavaScripでは
a = 100;
function bar() {
document.write(a);
}
function foo() {
a = 10;
bar();
}
foo();
=>10

perlのmyはレキシカルスコープ、localはダイナミックスコープだそうです。

posted by ほえ at 19:47| Comment(0) | TrackBack(1) | Scheme | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/19411319
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック

レキシカルスコープ(lexical scope、静的スコープ、構文スコープ)・ダイナミックスコープ(dynamic scope、動的スコープ)が間違っていた件
Excerpt: 昔の記事を見てみたら、ずいぶんと間違っていたので書きなおしてみます。 動的スコープ、静的スコープ両方の変数が使用できるperlが一番わかりやすいようです。 localで動的スコープ、myで静的スコー..
Weblog: ほえほえのLinux
Tracked: 2008-02-15 18:55
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。