1 Nyquist插件基础:LISP语法-变量及赋值
在LISP中,变量的定义和赋值是编程的基础操作,下面将为你详细介绍Common LISP中变量定义和赋值的相关知识。
- 变量类型
在LISP里,变量主要分为两类:全局变量
和局部变量
。
1.1 全局变量的定义与赋值
全局变量在整个程序中都可以被访问。在Common LISP中,全局变量通常用两个星号 *
来标记。
1.1.1 定义和赋值全局变量
使用 defvar
或者 defparameter
来定义和赋值全局变量。
defvar
:如果变量未定义,defvar
会对其进行定义并赋值;若变量已存在,则不会重新赋值。
(defvar *my-global-variable* 10)
(format t "The value of *my-global-variable* is: ~A~%" *my-global-variable*)
在上述代码中,定义了一个全局变量 *my-global-variable*
,并将其初始值设为 10,随后将其值输出。
defparameter
:无论变量是否已经定义,defparameter
都会重新对其赋值。
(defparameter *another-global-variable* 20)
(format t "The value of *another-global-variable* is: ~A~%" *another-global-variable*)
这里定义了另一个全局变量 *another-global-variable*
,并将其初始值设为 20,最后输出其值。
1.2 局部变量的定义与赋值
局部变量仅在特定的代码块中有效。在Common LISP中,一般使用 let
、let*
和 flet
、labels
来定义局部变量。
1.2.1 使用 let
定义局部变量
let
可以同时定义多个局部变量,并且这些变量的初始值可以相互独立。
(let ((x 5) (y 10))
(format t "The value of x is: ~A, and the value of y is: ~A~%" x y)
(+ x y))
上述代码中,let
创建了两个局部变量 x
和 y
,分别赋值为 5 和 10,然后输出它们的值,最后返回它们的和。
1.2.2 使用 let*
定义局部变量
let*
与 let
类似,但 let*
允许后面定义的变量使用前面已经定义好的变量的值。
(let* ((a 3) (b (+ a 2)))
(format t "The value of a is: ~A, and the value of b is: ~A~%" a b))
在这段代码里,let*
先定义了变量 a
并赋值为 3,接着定义变量 b
,其值为 a + 2
,最后输出这两个变量的值。
1.2.3 使用 flet
和 labels
定义局部函数变量
flet
和 labels
用于定义局部函数变量。flet
定义的函数不能相互递归调用,而 labels
定义的函数可以。
flet
示例
(flet ((square (n) (* n n)))
(format t "The square of 4 is: ~A~%" (square 4)))
这里使用 flet
定义了一个局部函数 square
,用于计算一个数的平方,然后调用该函数计算 4 的平方并输出结果。
labels
示例
(labels ((factorial (n)
(if (zerop n)
1
(* n (factorial (- n 1))))))
(format t "The factorial of 5 is: ~A~%" (factorial 5)))
此代码使用 labels
定义了一个递归函数 factorial
来计算阶乘,接着计算 5 的阶乘并输出结果。
1.3 变量的重新赋值
在LISP中,可以使用 setq
来对变量重新赋值。
(defvar *test-variable* 100)
(format t "The original value of *test-variable* is: ~A~%" *test-variable*)
(setq *test-variable* 200)
(format t "The new value of *test-variable* is: ~A~%" *test-variable*)
上述代码先定义了一个全局变量 *test-variable*
并赋值为 100,然后使用 setq
将其值重新赋为 200,最后分别输出变量的初始值和新值。
1.4 总结
- 定义全局变量:
defvar
,defparameter
- 定义局部变量:
let
,let*
(变量赋值重用) - 变量赋值:
setq
- 局部函数:
flet
、labels
(可递归)!
LISP的数学计算能力是真猛!! 递归函数阶乘算到2万都能秒出结果,而一般的脚本语言(如:AWK),阶乘到170就是极限了!
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.