在LispWorks中进行编程07:变量

  • 0

在LispWorks中进行编程07:变量

Category:UI界面编写 Tags : 

变量

让我们考虑如何编写一个函数来从美元转换成磅。程序如下:

  • 用汇率乘以美元数。

汇率是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过程,可以引用var1var2

作为其使用的一个例子,请记住我们对平均  程序的定义:

(defun average (1st-number 2nd-number)
(/ (+ 1st-number 2nd-number) 2))

参数1st-number2nd-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代替二次方程式:

 –   + 41

检查:

(pseudo-primes 40)

给1601。

http://mip.i3geek.com

Leave a Reply

搜索

分类目录

公 告

本网站学习论坛:

www.zhlisp.com

lisp中文学习源码:

https://github.com/zhlisp/

欢迎大家来到本站,请积极评论发言;

加QQ群学习交流。