Elisp 变量
Table of Contents
setq
使用 setq
关键字直接对一个变量赋值:
(setq foo "I'm foo") ; => "I'm foo" (message foo) ; => "I'm foo"
使用
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
用 foo
的文档,可以看到它已经变成:
foo's value is "I'm foo" Documentation: A demo variable
setq-default
如果一个变量是 buffer-local 变量,那么 buffer-local 变量会在加载这个特定的 buffer 时赋值。
setq、setq-default、setq-local 还有 Local Variables
(setq-default fill-column 80) (setq fill-column 81) (setq-local fill-column 82) 以及在文件中加入: # Local Variables: # fill-column: 83 # End:
最终值的设置顺序:
- 默认值(setq-default):fill-column 默认是 80。
- 全局值(setq):改为 81,覆盖了默认值。
- 局部值(setq-local):在当前 buffer 设置为 82,覆盖了全局值。
- 文件 Local Variables 块:打开文件后,解析到 Local Variables 块,局部值被设为 83,覆盖了 setq-local 的值。
当打开文件后,fill-column 的值最终为 83。
局部作用域的变量 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)))