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

[xyzzy:02930] Re: JIS でクリップボードに送りたい。



HATTORI Masashi <hattori@xxxxxxxxxxxxxxxx> さん、こんにちは。masahito です。

|> 	    (declare (special *kanji-expected-code*))
|
|すみません。この"declare"と"special"って何をするものなんでしょう。

http://www.netlaputa.ne.jp/~henmi/lisp/xyzzy/etc/resource.html
のLISP関数リファレンスとinfo-modokiをダウンロードすると
少しはいい事があるかもしれません。
・・・・あなたが理解できるかどうかを保証するものではありません^^;

たとえば、lispモードや*scratch*でlispを書いているときに
declareと書いてF1を押すと以下のような説明が表示されます。

■declare
   (declare (special 変数名))

> これは関数ではなくてスペシャル宣言というやつで、動的に 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のように動くという訳。

------------------------------------------------------------
逸見雅人    Masahito Henmi  henmi@xxxxxxxxxxxxx
♪あなたの願いも仕事もうまくいきますように・・・

Index Home