(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宣言自体を普段はほとんど使わないので知らなかったが、これはなかなか面白い。
乱用したらソースコードの可読性がかなり悪くなりそうだが、どこかで使えるかもしれないので、覚えておく。