[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: let (was: Re: インフォについて)



井上です。
昨夜遅くに書きかけたのですが、うまく書けなくて・・・

TAKAHASHI Naoto <ntakahas@...> writes:

> let はローカル変数が使える progn だと思って下さい。
> (let ((x 1) (y 2) (z 3)) なんたらかんたら)
> は、xに1を、yに2を、zに3を割り当てた状態で「なんたらかんたら」を実行し
> ます。setq と違うのは、let が終了すると、これらローカル変数の割り当て
> は、「なかったこと」にされてしまう点です。write-file-in-sjis の例だと、
> この関数を実行している間だけ coding-system-for-write の値が sjis にな
> ります。write-file-in-sjis の実行が終わると、coding-system-for-write
> は実行以前の値に戻ります。

ここで、let特有なのかLisp特有なのか分からないのですが、
write-file-in-sjisの例では、中で呼び出されるwrite-fileからは、あたかもグ
ローバルにcoding-system-for-writeの値が変更されているかのように見えてい
る(はず)ということです。
Cだと、他の関数Aの中で関数Bを呼び出すとき、Bに対して引数として渡さない限
り、BがAのローカル変数に影響されることはないと思います。
つまり、Cで同様のことをするとしたら、
write-file-in-sjisの中では、まずグローバル変数coding-system-for-writeの
値をバックアップし、その値をsjis-dosに変えて、
その後にwrite-fileを実行し(write-file中ではグローバル変数の
coding-system-for-writeが参照される?)
終わったらcoding-system-for-writeの値をバックアップしてあった値に戻して
終了
という感じになるのだと思います。

でも、letではグローバル変数が定義されているかどうかに関わらずletの中出だ
け通用するローカル変数を新しくつくることもできます。

本当にcoding-system-for-writeのグローバルな値が変更されているのか、そ
  の辺をよく分かってないので、間違っていたり理解に問題がある場合は指摘し
  ていただけると助かります。
この辺の話もEmacs Lispのマニュアルに詳しく書いてあった気がします。

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690