在LispWorks中进行编程07:变量
Category:UI界面编写变量
让我们考虑如何编写一个函数来从美元转换成磅。程序如下:
- 用汇率乘以美元数。
汇率是1美元的英镑数; 我们今天说它是0.61。所以我们的程序定义很简单:
(defun convert (dollars) (* dollars 0.61))
我们称之为:
CL-USER > (convert 100)61.0
在转换的定义中,符号 美元是一个变量。它就像一个盒子,我们将任何我们想要的值转换成磅。
此外,它被称为局部变量,因为该值仅在函数体内可用。如果我们尝试在程序之外评估美元,我们会得到:
CL-USER > dollars
Error: The variable DOLLARS is unbound.
Unbound是另一种说法,它没有价值。
定义变量:defparameter
但转换的一个问题是,如果汇率发生变化,我们必须重新定义它。我们需要的是一个我们可以设定为当前汇率的变量。我们可以用defparameter做到这一点:
(defparameter exchange-rate 0.61)
defparameter定义的变量称为全局变量,因为您可以在任何地方引用它们。
CL-USER > exchange-rate0.61
所以现在我们可以重新定义转换以使用汇率变量:
(defun convert (dollars) (* dollars exchange-rate))
一个常见的约定是为每个全局变量赋一个以星号开头和结尾的名称,例如* exchange-rate *,以提醒您它是全局变量 。
更改变量的值:setf
要更改变量的值,我们可以使用setf。例如,如果汇率变为0.7:
(setf exchange-rate 0.7)
现在转换 程序将自动反映新的汇率:
CL-USER > (convert 100)70.0
创建局部变量:let*
该设*结构允许你定义一个或多个变量,用指定的初始值,这是本地的身体让*结构。它是这样写的:
(let* ((var1 value1) (var2 value2) …) body)
哪里:
- var1是第一个局部变量,value1是其初始值。
- var2是第二个局部变量,value2是其初始值,依此类推。
- body是一个或多个Lisp过程,可以引用var1和var2。
作为其使用的一个例子,请记住我们对平均 程序的定义:
(defun average (1st-number 2nd-number)
(/ (+ 1st-number 2nd-number) 2))
参数1st-number和2nd-number是局部变量,位于过程体的本地。
但是假设我们想要将计算分解为步骤,使用局部变量sum来存储两个数字的总和,并使用另一个局部变量result来存储将其除以2的结果。
我们可以用let *来做到这一点 :
(defun average (1st-number 2nd-number) (let* ((sum (+ 1st-number 2nd-number)) (result (/ sum 2))) result))
请注意,let *中的星号是名称的一部分 – let *是一个名为let的运算符的更通用版本; 我们不会担心现阶段的差异。
演习
1.在千米和英里之间转换
使用defparameter定义变量来表示:
1公里= 0.621371192英里
使用它来定义两个程序, convert-km 和convert-miles,将英里转换为km和km转换为英里,并检查80 km转换为大约50英里。
2.找到三个数字的平均值
定义一个程序 average3 ,它找到三个数字的平均值。
检查:
(average3 21 7 8)
给出12。
3.立方体两个数字的总和
这是一个计算(a + b)x(a + b)x(a + b)的过程 立方体 :
(defun cubesum (a b) (* (+ a b) (+ a b) (+ a b)))
使用let *来编写它,因此(a + b)只计算一次。
检查:
(cubesum 3 4)
给出了343。
4.将值替换为二次方程
编写一个过程伪素数,用x代替二次方程式:
x 2 – x + 41
检查:
(pseudo-primes 40)
给1601。
http://mip.i3geek.com