setq
和defvar
Emacs lisp 和有什么不一样?
我在/programming/3855862看到了相同问题的常见Lisp版本。他们在伊利斯(Elisp)是否一样?
setq
和defvar
Emacs lisp 和有什么不一样?
我在/programming/3855862看到了相同问题的常见Lisp版本。他们在伊利斯(Elisp)是否一样?
Answers:
您应该向Emacs询问以下问题:C-h i
,选择Elisp手册(m Elisp
),并在索引中搜索“ defvar”(i defvar
)。这将带您进入定义变量节点。
Emacs告诉您defvar
允许附加文档字符串,并且如果变量已经具有值,则它什么也不做。
它还会告诉您有关defvar
没有赋值的的使用:(defvar foo)
。它告诉您,该变量声明了动态范围。
setq
没有这些属性。
defvar
和setq
相似,但并不完全相同,在Emacs Lisp和Common Lisp的。
defvar
全局变量(如命令式编程样式)和自定义约定,而setq更像是函数编程语言中的let绑定(具有动态/词法作用域规则,取决于活动的全局作用域模式。 .......)
setq
设置var值,而不管var(出现)是否是本地的。defvar
将var声明为global。(也可以是“局部缓冲区”:local-variable-p
。)通常情况下,以函数arg或by绑定的var出现let
是“局部的”。如果由let
etc. 绑定的var 是全局的(或局部缓冲区),则在该持续时间/范围内为其创建局部绑定(常识)let
。在该绑定范围内,setq
更改本地值。最好是将var 出现在本地(在堆栈上)或全局(在堆上),而不是在本地。
M-x report-emacs-bug
提出改进建议可能会有所帮助,这些改进可能会帮助其他人使它变得更容易。