![変なモノ 変なモノ](https://srad.jp/static/topics/humor_64.png)
route127の日記: スーパーグローバル 1
日記 by
route127
文部科学省の施策ではなくautohotkeyの言語仕様における変数スコープの話である。
ahkの変数はすべてグローバル変数だと思ってたが、関数の外で定義されたグローバル変数を関数の中から参照できないことに気付いた。
関数の外で変数を定義するときにglobalを宣言しておけば関数内でも参照できたのでそれで間に合わせた。
ヘルプドキュメントによればそういう使い方をスーパーグローバル変数というらしい。
もともとglobal宣言子は関数内から関数の外側のグローバル変数を参照する為のものだったらしい。
似たようなところで悩んでる人もいた。
日本語記事だと「スーパーグローバル変数」というとPHPの記事ばかりが目につくが使い方を見るとahkに似ている。
今回「関数の中からグローバル変数が参照できない」という現象を奇異に思っていたが言語処理系によってはそれが普通なんだろうか。
関数スコープといえば「CommonLISPのレキシカルスコープは意図したものではなかった」みたいな話を聞いた覚えがあったけど今検索かけても見つけられなかった。
昔のLISP処理系はだいたいダイナミックスコープだとか聞いたことあるけれども触ったことないのでどういうものなのか分からん。
PowerShellもダイナミックスコープらしいがfunargバグとか説明読んでもいまいちピンとこない。
まあ自分で処理系作ってみるなりしないと理解が深まらなそうな気はする。
(結局phpとかahkがこういうスコープの持ち方することに処理系設計上の理由があるかまでわからなかった。)
pythonの場合 (スコア:1)
pythonの場合、次のような挙動になります
1) global宣言無しの場合、グローバルなオブジェクトはreadできる
2) global宣言無しの場合、グローバルなオブジェクトにwriteしてもエラーは出ない
3) glibal宣言有りの場合、read/writeどちらも期待通り動作する
2)の場合は、グローバルなオブジェクトのコピーがローカル変数として新規生成され、ローカル変数にwriteを行う、という動作になります。
つまりグローバル側のオブジェクトはwriteされません