From d7e1b1659071a7dbf4ea5685d85a07e850c0211e Mon Sep 17 00:00:00 2001 From: "Kaz Saita(raspi5)" Date: Fri, 17 May 2024 13:15:03 +0900 Subject: [PATCH] sync notes(auto) --- ...0240428125606 ダイナミックスコープ レキシカルスコープ.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/20240428125606 ダイナミックスコープ レキシカルスコープ.md b/content/20240428125606 ダイナミックスコープ レキシカルスコープ.md index 1b238d2..200cdf2 100644 --- a/content/20240428125606 ダイナミックスコープ レキシカルスコープ.md +++ b/content/20240428125606 ダイナミックスコープ レキシカルスコープ.md @@ -47,7 +47,7 @@ int main(void) レキシカルスコープの言語では、変数名とその参照先は一意に決まる。実行された状況などに左右されない。ここでいう一意というのは、「同じ名前の変数が色々定義されてた場合、そのうちのどれ?」というのが(つまり、環境フレームが)一意という意味であって、その中身は実行された状況に左右されない、というわけではない。 -ダイナミックスコープの言語では、変数の値がどうなっているかは、実行された状況に左右される(だからダイナミックスコープという)。 +ダイナミックスコープの言語では、変数名で何を参照するかが、実行された状況に左右される(だからダイナミックスコープという)。 例えば、下記を実行したら、ダイナミックスコープの場合は`2`が表示される。実際は0だけど。 ```c @@ -82,9 +82,9 @@ int main(void) ## 経緯とかお気持ちとか そもそもはレキシカルスコープにしたかったが、初期のLISPではダイナミックスコープになってしまったらしい。じゃあその頃、他の言語はどうだったんだ、とか、別途気になる。 -レキシカルスコープがいかに重要なのか?とか、どうやったらそれが実現できるのか?をレキシカルスコープなschemeを作った人が書いたSICPが詳細に説明しているのは、そういう理由からかもしれない(根拠なし)。cf. [評価の環境モデル(SICP)](https://sicp.iijlab.net/fulltext/x320.html) +レキシカルスコープがいかに重要なのか?とか、どうやったらそれが実現できるのか?をレキシカルスコープなlispことschemeを作った人が書いたSICPが、やたら詳細に説明しているのは、そういう理由からかもしれない(根拠なし)。cf. [評価の環境モデル(SICP)](https://sicp.iijlab.net/fulltext/x320.html) -ちなみにレキシカルスコープのインタプリタを実装しようとすると、関数呼び出しのとき、別の関数を呼ぶ場合、呼び出し元で定義したローカル変数のかたまり(フレーム)を一旦無効にしてから関数を呼び出す必要があり、関数から戻って来た時にフレームを再度有効にする必要がある。この用途のため、フレーム保存しておく必要があるが、再帰呼び出しなどの時、(末尾再帰でないなら)毎回そのフレームを保存しておく必要があり、メモリ消費量が多くなる。というような、「ダイナミックスコープになった経緯」みたいな話をネットでチョイチョイ見るが、単純にフレームの保存をしていないという、現代の視点から見るとバグっぽい挙動に見えてしまう。 +ちなみにレキシカルスコープのインタプリタを実装しようとすると、関数呼び出しのとき、別の関数を呼ぶ場合、呼び出し元で定義したローカル変数のかたまり(フレーム)を一旦無効にしてから関数を呼び出す必要があり、関数から戻って来た時にフレームを再度有効にする必要がある。この用途のため、フレーム保存しておく必要があるが、再帰呼び出しなどの時、(末尾再帰でないなら)毎回そのフレームを保存しておく必要があり、メモリ消費量が多くなる。まあ実際そうなんだけど、このような、「ダイナミックスコープになった経緯」みたいな話をネットでチョイチョイ見るが、単純にフレームの保存をしていないという、現代の視点から見るとバグっぽい挙動に見えてしまう。 ### Refs.