setq 和 defvar 的区别

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​ 用于赋值,可以在任何上下文中使用,且每次调用都会更新变量的值。
  • Lisp
    38 引用 • 13 回帖 • 1 关注

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...