サーチ…


グローバルな特殊変数はどこでも特別です

したがって、これらの変数は動的バインディングを使用します。

(defparameter count 0)
;; All uses of count will refer to this one 

(defun handle-number (number)
  (incf count)
  (format t "~&~d~%" number))
  
(dotimes (count 4)
  ;; count is shadowed, but still special
  (handle-number count))
  
(format t "~&Calls: ~d~%" count)
==>
0
2
Calls: 0

特別な変数には、この問題を避けるために異なる名前を付けます。

(defparameter *count* 0)

(defun handle-number (number)
  (incf *count*)
  (format t "~&~d~%" number))
  
(dotimes (count 4)
  (handle-number count))
  
(format t "~&Calls: ~d~%" *count*)
==>
0
1
2
3
Calls: 4

注1:特定のスコープ内でグローバル変数を特別なものにすることはできません。変数をレキシカルにする宣言はありません。

注2: special宣言を使用してローカルコンテキストで変数specialを宣言することは可能です。その変数のグローバルな特殊宣言がない場合、宣言はローカルのみであり、シャドーすることができます。

(defun bar ()
  (declare (special a))
  a)                       ; value of A is looked up from the dynamic binding

(defun foo ()
  (let ((a 42))            ; <- this variable A is special and
                           ;    dynamically bound
    (declare (special a))
    (list (bar)
          (let ((a 0))     ; <- this variable A is lexical
            (bar)))))


> (foo)
(42 42)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow