common-lisp
Лексические и специальные переменные
Поиск…
Глобальные специальные переменные везде
Таким образом, эти переменные будут использовать динамическое связывание.
(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
декларацию. Если глобальная специальная декларация для этой переменной отсутствует, декларация будет только локальной и может быть затенена.
(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