Elisp 变量

Table of Contents

setq

使用 setq 关键字直接对一个变量赋值:

(setq foo "I'm foo")                    ; => "I'm foo"
(message foo)                           ; => "I'm foo"

使用 C-h v 可以查看变量的文档。

defvar

(defvar variable-name value
  "document string")

与 setq 所不同的是,如果变量在声明之前,这个变量已经有一个值的话,用 defvar 声明的变量值不会改变成声明的那个值。另一个区别是 defvar 可以为变量提供文档字符串,当变量是在文件中定义的话,C-h v 后能给出变量定义的位置。

(defvar foo "Did I have a value?"
  "A demo variable")                    ; => foo
foo                                     ; => "I'm foo"
(defvar bar "I'm bar"
  "A demo variable named \"bar\"")      ; => bar
bar

C-h v 查看 foo 的文档,可以看到它已经变成:

foo's value is "I'm foo"

Documentation:
A demo variable

setq-default

如果一个变量是 buffer-local 变量,那么 buffer-local 变量会在加载这个特定的 buffer 时赋值。

局部作用域的变量 let* let

(let ((var1 value1)
      (var2 value2)
      ...)
  body)
(defun circle-area (radix)
  (let ((pi 3.1415926)
        area) ;; area 是初始值为 nil 的局部变量
    (setq area (* pi radix radix))
    (message "直径为 %.2f 的圆面积是 %.2f" radix area)))
(circle-area 3)

let*let 的使用形式完全相同,唯一的区别是在 let* 声明中就能使用前面声明的变量,比如:

(defun circle-area (radix)
  (let* ((pi 3.1415926)
         (area (* pi radix radix)))
    (message "直径为 %.2f 的圆面积是 %.2f" radix area)))