Suche…


Globale spezielle Variablen sind überall etwas Besonderes

Daher verwenden diese Variablen die dynamische Bindung.

(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

Vergeben Sie spezielle Variablen, um dieses Problem zu vermeiden:

(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

Anmerkung 1: Es ist nicht möglich, eine globale Variable in einem bestimmten Bereich als nicht speziell zu definieren. Es gibt keine Deklaration, um eine Variable lexikalisch zu machen.

Hinweis 2: Es ist möglich, eine Variable special in einem lokalen Kontext mit der special Deklaration zu deklarieren. Wenn für diese Variable keine globale spezielle Deklaration vorhanden ist, ist die Deklaration nur lokal und kann gespiegelt werden.

(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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow