setq和defvar有什么区别


14

setqdefvarEmacs lisp 和有什么不一样?

我在/programming/3855862看到了相同问题的常见Lisp版本。他们在伊利斯(Elisp)是否一样?

Answers:


18

您应该向Emacs询问以下问题:C-h i,选择Elisp手册(m Elisp),并在索引中搜索“ defvar”(i defvar)。这将带您进入定义变量节点。

Emacs告诉您defvar允许附加文档字符串,并且如果变量已经具有值,则它什么也不做

它还会告诉您有关defvar没有赋值的的使用:(defvar foo)。它告诉您,该变量声明了动态范围

setq 没有这些属性。

defvarsetq相似,但并不完全相同,在Emacs Lisp和Common Lisp的。

阅读更多,了解更多。


1
实际上,如果给出了值,则defvar也会声明“动态作用域”,即使变量已经具有值,它也保持为真。OTOH对于defvar的所有有效使用都是“如果变量已经具有值,则它什么都不做”(在其余情况下,字节编译器应发出警告,即,在首次使用变量后声明变量)。
YoungFrog

因此听起来像是defvar全局变量(如命令式编程样式)和自定义约定,而setq更像是函数编程语言中的let绑定(具有动态/词法作用域规则,取决于活动的全局作用域模式。 .......)
nicolas

@nicolas:请阅读手册。setq设置var值,而不管var(出现)是否是本地的。defvar将var声明为global。(也可以是“局部缓冲区”:local-variable-p。)通常情况下,以函数arg或by绑定的var出现let是“局部的”。如果由letetc. 绑定的var 是全局的(或局部缓冲区),则在该持续时间/范围内为其创建局部绑定(常识)let。在该绑定范围内,setq更改本地值。最好是将var 出现在本地(在堆栈上)或全局(在堆上),而不是在本地。
提请

1
@nicolas:花点时间阅读并重新阅读它。有时它说的是精确的但很难掌握,例如正式的规范。一旦获得它,对您M-x report-emacs-bug提出改进建议可能会有所帮助,这些改进可能会帮助其他人使它变得更容易。
提请

1
@nicolas:首先了解堆上的变量(又称全局变量或局部缓冲区变量)。您可能已经了解了真正的局部变量,即stack变量。谷歌搜索也可能会有所帮助。
提请
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.