LISP 6.3 动态变量

来源:互联网 发布:美图秀秀 淘宝 编辑:程序博客网 时间:2024/05/17 23:59


词法绑定与赋予新值仅会影响当前作用域


词法绑定案例

CL-USER> (defvar *x* 10)*X*CL-USER> (defun foo()   (format t "x:~a~%" *x*))FOOCL-USER> (foo)x:10NILCL-USER> (defun bar()   (foo)   (let ((*x* 20)) (foo))   (foo))BARCL-USER> (bar)x:10x:20x:10NIL


赋予新值案例

;;;修改foo函数之后再次执行CL-USER> (defun foo()   (format t "Before assignment~18tX:~d~%" *x*)   (setf *x* (+ 1 *x*))   (format t "After assignment~18tX:~d~%" *x*))FOOCL-USER> (foo)Before assignment X:10After assignment  X:11NILCL-USER> (bar)Before assignment X:11After assignment  X:12Before assignment X:20After assignment  X:21Before assignment X:12After assignment  X:13NIL


对作用域的案例测试

注:


(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 AFOOCL-USER> (foo 3 7 )7 3NIL


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 AFOOCL-USER> (foo 3 7 )5 2NIL


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 AFOOCL-USER> (foo 3 7 )5 22 10NIL