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 时赋值。
局部作用域的变量 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)))