setq
和 defvar
在 Common Lisp 中都用于处理变量,但它们有不同的用途和行为。以下是它们之间的主要区别:
1. 定义 vs 赋值
-
defvar
:- 用于定义全局变量。
- 如果变量已经存在,
defvar
不会重新赋值。 - 通常用于初始化变量,并提供文档字符串。
(defvar my-var 10 "This is my variable.")
-
setq
:- 仅用于赋值,不会定义新变量(如果该变量尚未存在,则会自动创建)。
- 可以在任何时候改变变量的值,甚至在不同的作用域中。
(setq my-var 20) ; 直接修改 my-var 的值
2. 作用域
-
defvar
:- 主要用于全局变量,通常在包级别定义。
-
setq
:- 可以在任何上下文中使用,包括局部和全局作用域。
3. 初始化
-
defvar
:- 在第一次加载时初始化变量。后续的加载不会改变变量的值(除非手动修改)。
-
setq
:- 每次调用都会赋值,不具备初始值的概念。
示例比较
;; 使用 defvar 定义全局变量
(defvar my-global 10 "A global variable.")
;; 使用 setq 修改全局变量的值
(setq my-global 20) ; 现在 my-global 的值为 20
;; 使用 setq 定义局部变量
(let ((my-local 5))
(setq my-local 10)) ; my-local 在这个 let 中的值为 10
总结
-
defvar
用于定义和初始化全局变量,且不会在后续加载中覆盖。 -
setq
用于赋值,可以在任何上下文中使用,且每次调用都会更新变量的值。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于