(declare (special ...))

『Let Over Lambda』を読んでいたら、p.22の脚注に次のような記述を発見した。

We can also indicate the specialness of variables by using declarations to make them locally special.

declareで宣言すれば、"locally"なspecial変数が使える、というようなことらしい。

> (defun fun ()
    (* num num))

> (fun)
--> ; エラー:  The variable NUM is unbound.

> (let ((num 10))
    (declare (special num)) ; special宣言
    (fun))
--> 100

> (fun)
--> ; エラー:  The variable NUM is unbound.

確かに。 declareを使った場合、numが一時的にspecial変数になっている。
そもそも、spcial宣言自体を普段はほとんど使わないので知らなかったが、これはなかなか面白い。
乱用したらソースコードの可読性がかなり悪くなりそうだが、どこかで使えるかもしれないので、覚えておく。