LISP 6.3 动态变量


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


词法绑定案例

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值