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
선언을 사용하여 로컬 컨텍스트에서 변수 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