词法绑定与赋予新值仅会影响当前作用域
词法绑定案例
CL-USER> (defvar *x* 10)
*X*
CL-USER> (defun foo()
(format t "x:~a~%" *x*))
FOO
CL-USER> (foo)
x:10
NIL
CL-USER> (defun bar()
(foo)
(let ((*x* 20)) (foo))
(foo))
BAR
CL-USER> (bar)
x:10
x:20
x:10
NIL
赋予新值案例
;;;修改foo函数之后再次执行
CL-USER> (defun foo()
(format t "Before assignment~18tX:~d~%" *x*)
(setf *x* (+ 1 *x*))
(format t "After assignment~18tX:~d~%" *x*))
FOO
CL-USER> (foo)
Before assignment X:10
After assignment X:11
NIL
CL-USER> (bar)
Before assignment X:11
After assignment X:12
Before assignment X:20
After assignment X:21
Before assignment X:12
After assignment X:13
NIL
对作用域的案例测试
注:
(rotatef a b) 将两个变量值互换
(shiftf a b 10)值向左移动
1与2进行对比
1.
CL-USER> (defun foo(a b)
(let ((a 2) (b 5)))
(rotatef a b)
(format t "~a~t~a" a b))
;Compiler warnings :
; In FOO: Unused lexical variable B
; In FOO: Unused lexical variable A
FOO
CL-USER> (foo 3 7 )
7 3
NIL
2.
CL-USER> (defun foo(a b)
(let ((a 2) (b 5))
(rotatef a b)
(format t "~a~t~a" a b)))
;Compiler warnings :
; In FOO: Unused lexical variable B
; In FOO: Unused lexical variable A
FOO
CL-USER> (foo 3 7 )
5 2
NIL
CL-USER> (defun foo(a b)
(let ((a 2) (b 5))
(rotatef a b)
(format t "~a~t~a~%" a b)
(shiftf a b 10)
(format t "~a~t~a~%" a b)))
;Compiler warnings :
; In FOO: Unused lexical variable B
; In FOO: Unused lexical variable A
FOO
CL-USER> (foo 3 7 )
5 2
2 10
NIL