LISP - 变量


在 LISP 中,每个变量都由一个符号表示。变量的名称是符号的名称,它存储在符号的存储单元中。

全局变量

全局变量在整个 LISP 系统中具有永久值,并且在指定新值之前一直有效。

全局变量通常使用defvar构造来声明。

例如

(defvar x 234)
(write x)

当你点击执行按钮,或者输入Ctrl+E,LISP立即执行它,返回的结果是

234

由于 LISP 中没有变量的类型声明,因此您可以直接使用setq构造为符号指定值。

例如

->(setq x 10)

上面的表达式将值 10 赋给变量 x。您可以使用符号本身作为表达式来引用变量。

符号值函数允许您提取存储在符号存储位置的值。

例如

创建名为 main.lisp 的新源代码文件并在其中键入以下代码。

(setq x 10)
(setq y 20)
(format t "x = ~2d y = ~2d ~%" x y)

(setq x 100)
(setq y 200)
(format t "x = ~2d y = ~2d" x y)

当您单击“执行”按钮,或键入 Ctrl+E,LISP 立即执行它并返回结果为。

x = 10 y = 20 
x = 100 y = 200

局部变量

局部变量是在给定过程中定义的。在函数定义中命名为实参的形参也是局部变量。局部变量只能在各自的函数内访问。

与全局变量一样,局部变量也可以使用setq构造来创建。

还有另外两个构造 - letprog用于创建局部变量。

let 构造具有以下语法。

(let ((var1  val1) (var2  val2).. (varn  valn))<s-expressions>)

其中 var1、var2、..varn 是变量名称,val1、val2、..valn 是分配给各个变量的初始值。

当执行let时,每个变量都会被赋予各自的值,最后对s 表达式进行求值。返回最后计算的表达式的值。

如果不包含变量的初始值,则会将其指定为nil。

例子

创建名为 main.lisp 的新源代码文件并在其中键入以下代码。

(let ((x 'a) (y 'b)(z 'c))
(format t "x = ~a y = ~a z = ~a" x y z))

当您单击“执行”按钮,或键入 Ctrl+E,LISP 立即执行它并返回结果为。

x = A y = B z = C

prog构造还将局部变量列表作为其第一个参数,后面是prog的主体和任意数量的 s 表达式。

prog函数按顺序执行 s 表达式列表并返回 nil,除非遇到名为return 的函数调用。然后计算并返回返回函数的参数。

例子

创建名为 main.lisp 的新源代码文件并在其中键入以下代码。

(prog ((x '(a b c))(y '(1 2 3))(z '(p q 10)))
(format t "x = ~a y = ~a z = ~a" x y z))

当您单击“执行”按钮,或键入 Ctrl+E,LISP 立即执行它并返回结果为。

x = (A B C) y = (1 2 3) z = (P Q 10)