非常简单的问题,但让我困惑了一段时间:
(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)
不是。
请问这是为什么呢?
他们之所以不同,是因为他们不同:)
(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-bell和t,setq然后根据其参数设置值。希望您现在开始了解 Lisp 语法是如何工作的?
2严格来说,setq实际上是“特殊形式”而不是函数,而特殊形式更接近宏而不是函数;但这些区别对于本次问答并不重要。