View on GitHub

Yoy-wiw

A website on lisp.

Download this project as a .zip file Download this project as a tar.gz file

咱也学学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 美元。

但我仍然哪儿也去不成,因为没有签证。