declareとかdynamic scopeとか

elispはDynamicScopeなので以下のコードが動きます。

(defun bar ()
  (+ x y))

(defun foo ()
  (let ((x 3) (y 10))
  (bar)))

(foo) ; => 13

CommonLispとかSchemeはStaticScopeなので動きません。。
でも、CommonLispの場合declareを使うとDynamicScope的な振る舞いをさせることができるらしいです。
CommonLispがはいって無かったので入れました。*1

sudo aptitude install clisp slime

使いかたがよく分からなかったのですが、とりあえず以下のようにしたらslimeが使えました。

(require 'slime)
(slime-start :program "clisp")

それで試しに以下のような感じでかいてみたら動きました。確かに、declareを付けるとelispみたいに実行されるときに自身の外部の環境の情報が見れるようになるみたいです。

CL-USER> (defun bar ()  (+ x y))

BAR

CL-USER> (defun foo ()
  (let ((x 3) (y 2))
    (declare (special x))
    (declare (special y))
  (bar)))

FOO
CL-USER> (foo)
5

というか

元々はanything-c-moccur.elを読んでいて,その中で出てきたdeclareの意味を調べようと思ったのですけど><。declareがDynamicScopeを模倣するためのものなら,elispだといらないような気がします。結局declareってどういう意味なんだろう?

*1:こういうときubuntuとかは楽ですね><