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

[xyzzy:00463] Re: info



須田 さん、こんにちは。

>>   (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

Index Home