[xyzzy:08981] Re: popup-list と変数のスコープ
- Subject: [xyzzy:08981] Re: popup-list と変数のスコープ
- From: Inaizumi Keita <ekamasmi@xxxxxxxxxxx>
はじめまして、稲泉と申します。
以前から ML には登録させていただいていましたが、
投稿するのは初めてです。今後宜しくお願いします。
> 以下のようなコードにて
> (foo 11)
> を評価すると、msgbox で現れる num の値は 0
> になりますが、
> これはこういうものなのでしょうか?
> (declare (special num)) とした時点で
> num は動的にバインドされているので、
> 11 になる事を自分は期待したのですが。
> ========サンプルコード========
> (setq num 0)
>
> (defun foo (num)
> (declare (special num))
> (func))
>
> (defun func ()
> (popup-list
> '("123" "abc" "xyz")
> #'baz))
>
> (defun baz (x)
> (msgbox "\"~A\" and \"~D\" " x num))
> =====サンプルコード終わり=====
Common Lisp Hyper Spec に拠りますと、
special 宣言した変数に対し内部で新たに束縛が発生した場合
、
改めて宣言しなかったらその新しい束縛の内部では
レキシカル変数として扱われる、となっています。
つまり、popup-list に限らず「そういうもの」だと
考えたほうがよいかと思われます。
ともあれ、そうなると関係している全ての関数について
special 宣言すれば問題ない……ということになるはずですが
、
試してみたところ、どうもそれではうまく行きませんでした。
頭がついていかなくてちょっとそれ以上問題を追い込めなかっ
たのですが、
差し当たってサンプルコードについては、special 宣言を使う
より
以下のように num の値を受け渡していったほうが無難かと思
います。
(defun foo (num)
(func num))
(defun func (num)
(popup-list
'("123" "abc" "xyz")
(baz num)))
(defun baz (num)
#'(lambda (x)
(msgbox "\"~A\" and \"~D\" " x num)))
胡乱な発言で申し訳ありませんが、お役に立てば幸いです。
Inaizumi Keita
ekamasmi@xxxxxxxxxxx
__________________________________________________
Do You Yahoo!?
http://bb.yahoo.co.jp/