common-lisp                
            Variables lexicales vs spéciales
        
        
            
    Recherche…
Les variables spéciales globales sont spéciales partout
Ainsi, ces variables utiliseront une liaison dynamique.
(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
Attribuez des noms distincts aux variables spéciales pour éviter ce problème:
(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
Note 1: il est impossible de rendre une variable globale non spéciale dans une certaine portée. Il n'y a pas de déclaration pour faire une variable lexicale .
 Note 2: il est possible de déclarer une variable spéciale dans un contexte local en utilisant la déclaration special . S'il n'y a pas de déclaration spéciale globale pour cette variable, la déclaration est uniquement localisée et peut être ombrée. 
(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
        Sous licence CC BY-SA 3.0
        Non affilié à Stack Overflow