elisp 中的变量

elisp 中的变量:

概要:

1. 为变量赋值(setq)
2. 用命令为变量赋值(set-variabe)
3. 查看变量C-h v 或者命令(describe-variable)
4. 删除一个变量(makeunbound)

----------------------------------------
1. 为变量赋值
----------------------------------------

1.1 set 函数 与 setq 函数
例如: 为变量 var 赋值 "a string
emacs lisp 写法
(setq var "a string")
等价于
(set 'var "a string")
也等价于
(set (quote var) "a strng")
说明: (quote var) 返回值是 'var

如果用以下写法是什么结果呢?
(set var "a string")
首先, var 会当成表达式运行,对其求值,如果var 还没有赋值, 则给出错误.

Debugger entered--Lisp error: (void-variable var)

以上说明了函数set,setq 的区别和联系

1.2. setq 与 set-variable 辨析
set-variable 是交换式命令,可以为变量赋值    C-h f 可以找到它的描述(交互式,命令)
set-variable 可以修改变量的值,真是一个好命令!! 耶,从此我可以方便的临时修改环境中的变量了.

setq is a special form in ‘C source code’. C-h f 可以找到它的描述(非交互式,函数,c源码中特殊形式)

1.3. C-h v 等价于命令 describe-variable, C-h k 可以找到C-h v 的描述

----------------------------------------
2. 删除一个变量
----------------------------------------
虽然我用describe-variable 可以看到var 变量,但删除它却不容易.
怎样删除刚刚定义的var 变量呢? 我还是机缘巧合找到了
(+ 1 a)
 error: (void-variable a)
 我们通过手册查void-variable, 找到了无效变量和让变量无效的方法 makeunbound
例如:
  (setq x 1)               ; Put a value in the global binding.
       ⇒ 1
  (let ((x 2))             ; Locally bind it.
    (makunbound 'x)        ; Void the local binding.
    x)
  error→ Symbol's value as variable is void: x
  x                        ; The global binding is unchanged.
       ⇒ 1

删除内层bound, 则外层bound 即会暴露, 例如:
  (let ((x 2))             ; Locally bind it.
    (let ((x 3))           ; And again.
      (makunbound 'x)      ; Void the innermost-local binding.
      x))                  ; And refer: it’s void.

If a variable is void, trying to evaluate the
variable signals a ‘void-variable’ error, instead of returning a value.
如果符号没有定义, 想计算这个符号的值就会得到'void-variable', 我把它翻译成符号无效,
而不是返回符号的值.
精通c语言者还是容易理解这个概念的. 只不过c语言没有删除变量之说.
而交互式语言删除变量后就不能使用了,就看不见它了.因为变量表中不存在它了.

广义变量:下回再说,还没概念.
参考1: elisp 手册
参考2: 网上资料

猜你喜欢

转载自blog.csdn.net/hejinjing_tom_com/article/details/129199457