咱也学学Lisp(5)–变量
10 Oct 2012
原文见:http://lisp.plasticki.com/
咱们重温一下函数:
定义一个函数,用于把手头的米元变成RMB,可以这样定义(假定汇率为7.1):
CL-USER> (defun $2RMB (dollars) (* dollars 7.1))
$2RMB
CL-USER> ($2RMB 50)
355.0
那么50米元就换成355元人民币。函数中的dollars就是一个变量,而且是局部变量。为什么叫局部变量,因为只有在函数内部有效。当调用函数 (2RMB 50) 的时候,dollars这个变量的值就变成50。而如果在函数外面使用,就会是这样(出错了):
CL-USER> dollars
The variable DOLLARS is unbound.
既然有局部变量,就会有全局变量,像这样:
CL-USER> (defvar *exchange-rate* 7.1)
*EXCHANGE-RATE*
CL-USER> *exchange-rate*
7.1
定义了汇率,是不是和定义函数有一点像呢!下面重新定义函数 $2RMB 来使用这个变量
CL-USER> (defun $2RMB (dollars) (* dollars *exchange-rate*))
STYLE-WARNING: redefining COMMON-LISP-USER::$2RMB in DEFUN
$2RMB
小弟有个小小的抱怨,叫redefining,意思是已经定义一遍了,不要理他。(其实这是负责任的表现,是善意的提醒)
为什么要定义这个全局变量,意义可大着呢,我们有固定汇率变成了浮动汇率。如何浮动呢?
CL-USER> (setf *exchange-rate* 6.9)
6.9
CL-USER> ($2RMB 50)
345.0
我们把汇率变成了6.9,这样50米元就只能换345人民币了。
定义全局变量用 (defvar xxoo 1234),改变变量的值用 (setf xxoo 4321)。
回到局部变量,如果在函数内部需要用到别的局部变量怎么办?
用 let* 定义局部变量:
CL-USER> (let* ((v1 10) (v2 20) (v3 30))
(+ v1 v2) (+ v1 v2 v3))
60
指定v1值为10,v2值为20,v3值为30,然后将v1和v2加和,再将三个变量加和,let*可以定义任意多个变量,对变量的操作也可以任意多个步骤。
注意,局部变量只能在 let* 的范围内使用哦。
现在手头有100万rmb,要出去旅行,去米国还是去欧洲呢?
CL-USER> (defvar *eur-exchange-rate* 8.2)
*EUR-EXCHANGE-RATE*
CL-USER> (defun exchange (rmb)
(let* ((eur (/ rmb *eur-exchange-rate*))
(usd (/ rmb *exchange-rate*)))
(list eur usd)))
EXCHANGE
CL-USER> (exchange 1000000)
(121951.22 144927.53)
在汇率为 8.2 和 6.9 的情况下,可以换 121951.22 欧元,或 144927.53 美元。
但我仍然哪儿也去不成,因为没有签证。