Lisp - 变量



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

全局变量

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

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

main.lisp

; define a global variable x with a value of 234
(defvar x 234)
; print value of x
(write x)

输出

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

234

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

例如

; set value of x as 10
->(setq x 10)

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

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

示例 - 全局变量

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

main.lisp

; set x as 10
(setq x 10)
; set y as 20
(setq y 20)
; print x and y
(format t "x = ~2d y = ~2d ~%" x y)

; update value of x as 100
(setq x 100)
; update value of y as 200
(setq y 200)
; print updated values of x and y
(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。

示例 - 使用 let

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

main.lisp

; declare loca variables x, y and z and initialize them with a, b and c
(let ((x 'a) (y 'b)(z 'c))
; print values of x, y and z
(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的函数调用。然后,return函数的参数被求值并返回。

示例 - 使用 prog

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

main.lisp

; declare variables and assign thm list of values
(prog ((x '(a b c))(y '(1 2 3))(z '(p q 10)))
; print variables
(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)
广告

© . All rights reserved.