スペシャル変数

http://d.hatena.ne.jp/bejira/20070425/1177508925
を読んで、それじゃあ let でクロージャできないじゃんとか思ってやってみた。

先に javascriptクロージャの確認。

var myCount = (function(){
    var c = 0;
    return function(){
        return ++c;
    }
})();

alert(myCount()); //1
alert(myCount()); //2

var c = 7;
alert(c); //7

alert(myCount()); //3
alert(myCount()); //4
alert(c); //7

myCount は関数オブジェクトでそいつが自分の定義された環境でローカルな c を持ってる。

;; とりあえずただのクロージャつくる
(let ((c 0))
  (defun my-count ()
	(setf c (1+ c)))) ;my-count
(my-count) ;1
(my-count) ;2
c ;変数が定義されていません: c

;; んで c をスペシャル変数にすると
(defvar c 7) ;c
c ;7

(my-count) ;8
(my-count) ;9
c ;9

がーん。ショックだ。
つまり let してようが同じ名前のスペシャル変数作られちゃったらローカルなのをキープはできない?progv っての(xyzzy には無いようだ)使えばできる?よくわからんがとりあえずスペシャル変数はちゃんと *special-variable* とかって名前にしておくようにしよう。


スコープとマクロのあたりはじっくり勉強しておきたい。