スペシャル変数
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* とかって名前にしておくようにしよう。
スコープとマクロのあたりはじっくり勉強しておきたい。