common-lisp
Lexicale versus speciale variabelen
Zoeken…
Globale speciale variabelen zijn overal speciaal
Deze variabelen zullen dus dynamische binding gebruiken.
(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
Geef speciale variabelen verschillende namen om dit probleem te voorkomen:
(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
Opmerking 1: het is niet mogelijk om een globale variabele niet-speciaal te maken in een bepaald bereik. Er is geen verklaring om een variabele lexical te maken .
Opmerking 2: het is mogelijk om een variabele special in een lokale context te declareren met behulp van de special
declaratie. Als er geen algemene speciale verklaring voor die variabele is, is de verklaring alleen lokaal en kan deze worden overschaduwd.
(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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow