[xyzzy:00463] Re: info
- Subject: [xyzzy:00463] Re: info
- From: Masahito Henmi <henmi@xxxxxxxxxxxxx>
- X-mailer: Denshin 8 Go V321.2b5
須田 さん、こんにちは。
>> (declare (special buffer-read-only))
> これは関数ではなくてスペシャル宣言というやつで、動的に bind し
> ろってことです。emacs ではそもそも動的にしか bind できないので、
> これは存在しません。
これなら答えられるので、答えようと思っていたら亀井さんに先を
超されてしまいました(笑)
では、もうちょっと初心者向けに説明。
(setq x 0) ; 大域変数
(defun foo (x)
(+ x y) <---- ※
)
(defun boo (y)
(foo 12)
)
とあったときに、 (boo 34)と呼び出すと
古いLISPでは(Emacs lispを含む)
※の時点で y = 34, x = 12と見えるのです。
ところが、Commonlispやxyzzyでは
※の時点で y = 34, x = 0と見えるのです。
昔LISPはインタープリタだったので、動的バインディング
でもよかったんだけど、
コンパイラを作る時に、効率上なにかと問題があってCommonLisp
では、静的バインディングに変更になりました。
でも、そうすると、古いコードを移植するのが大変になるので、
(defun boo (y)
(declare (special y))
(foo 12)
)
と書いてやると古いLISPのように動くという訳。
>> (declare (special buffer-read-only))
でも、これってバッファーローカル変数だよね???
------------------------------------------------------------
逸見雅人 Email henmi@xxxxxxxxxxxxx
Masahito Henmi