使用“setq”或不设置 Emacs 设置有什么区别?

X.A*_*hur 3 emacs dot-emacs

非常简单的问题,但让我困惑了一段时间:

(setq visible-bell t)
Run Code Online (Sandbox Code Playgroud)

(visible-bell t)
Run Code Online (Sandbox Code Playgroud)

两者似乎都有效。

(desktop-save-mode 1)
Run Code Online (Sandbox Code Playgroud)

有效,同时

(setq desktop-save-mode 1)
Run Code Online (Sandbox Code Playgroud)

不是。

请问这是为什么呢?

phi*_*ils 5

他们之所以不同,是因为他们不同:)

(setq visible-bell t)
Run Code Online (Sandbox Code Playgroud)

正在将值分配t给名为 的变量visible-bell

(visible-bell t)
Run Code Online (Sandbox Code Playgroud)

正在调用名为1 的函数visible-bell(并将值t作为参数传递)。

(虽然仅供参考,当前版本的 Emacs 中默认没有函数,所以对我来说,这实际上visible-bell并不像你想象的那样工作?但是,暂时假设你确实有这样的函数......)

Emacs Lisp 是“Lisp-2”,这意味着它具有独立的变量和函数名称空间,因此您可以(并且通常这样做)拥有同名的变量和函数。所指的是哪一个总是隐含在代码的上下文中(例如setq总是指一个变量)。

简而言之,这两段代码正在做非常不同的事情。这并不意味着它们不能具有等效的效果(例如,函数可能只是设置变量的值);但实际情况是否如此完全取决于函数的定义。


1实际上第一行代码也是调用一个函数2:它调用setq并传递两个参数visible-belltsetq然后根据其参数设置值。希望您现在开始了解 Lisp 语法是如何工作的?

2严格来说,setq实际上是“特殊形式”而不是函数,而特殊形式更接近宏而不是函数;但这些区别对于本次问答并不重要。