Elisp快速自学笔记(4)变量与作用域

原创
2021/09/08 14:04
阅读数 35

变量的几种定义方式

使用setq

(setq num 100)

也可以使用set,但变量名称需要使用'作为前缀:

(set 'num 100)

也可以一次定义多个变量:

(setq name "Cabins"
      age 20
      address "Shenzhen")

使用defvar

基本语法格式:

(defvar name "Cabins"
	"Define the name of the author.")
  • 只能定义之前没有存在的变量,如果对已经存在的变量进行重新定义,则不起作用
  • 可以添加变量文档来说明变量的用途

只在当前buffer生效的变量

使用setq-local来定义。

(setq-local file-name "test.el")

这样定义的变量只在当前的buffer中生效,其他的buffer中仍然使用其原来的值。

如果只声明而不赋值,则可使用make-variable-buffer-local函数完成:

(make-variable-buffer-local 'var-buffer-only)

设置默认值

使用setq-default完成对buffer-local的变量完成赋值。

(setq-default tab-width 2
		eval-shift-width 2)

需要特别注意的是:这个函数修改之后只对未来生效,当前的buffer并不生效。

作用域

全局作用域

  • 常用于储存命令的配置,或者全局配置
  • 将来代码执行的时候需要用到的变量的值

局部作用域

当前代码块就需要使用的变量。

  • 使用let
  • 使用let*

两者的区别是let* 定义的变量在接下来的变量定义中立马就可以使用。如以下代码中的z就使用了定义中的x,y:

(let* ((x 1)
	(y 2)
	(z (+ x y)))
)

面向用户配置的变量

使用defcustom来定义面向用户配置的一些变量。常用于允许用户自定义配置的场景。而且这样定义的变量会出现在UI配置界面中。

基本语法格式为:

(defcustom custom-variable 42
	"The custom variable with default value 42.")

defcustom会带有几个常见的附加参数:

  • :type 变量类型
  • :group 变量隶属的组
  • :options 变量的可能取值范围
  • :set 变量被赋值时触发的函数
  • :initialize 变量初始化时候触发的函数
  • :local 是否变量定义为buffer-local

使用customize-set-variable进行自定义变量的赋值。

使用customize-variable-p来判断是否是自定义变量。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部