[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:08981] Re: popup-list と変数のスコープ



はじめまして、稲泉と申します。
以前から 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/

Index Home