布尔值:t vs. nil vs 1 vs -1

Boolean values: t vs. nil vs 1 vs -1

在 Elisp 中,我遇到了用于建模布尔值的不同 API。

我的印象是 tnil 分别是表示 true 和 false 的惯用方式。但是,我也看到 1-1 用于模拟同一事物。

让我感到困惑的是,我遇到过如果提供 nil 就无法工作但如果使用 -1 就可以工作的 API。

有人可以帮助我了解哪种方式实际上是首选方式。如果答案是 tnil,我欢迎任何关于为什么一些开发人员将 1-1 用于他们的 API 的理论...

Lisp

在 lisp(Emacs Lisp 和 Common Lisp)中,唯一的错误值是 nil。 其他一切都是真的,包括 0, -1 &c &c.

Emacs

Emacs 使用否定参数(包括 -1)来表示 "turn off this mode"。例如,C-h f toggle-truncate-lines

With prefix argument ARG, truncate long lines if ARG is positive, otherwise fold them.

sds 和 sepp2k 已经涵盖了主要的误解,但在回答:

why some developers use 1 and -1 for their APIs...

Emacs 次要模式使用正数和负数(或者 non-positive 数字,包括零)来表示 "enable" 和 "disable",而不是使用 tnil 是参数是 可选 ,当未提供可选参数时,其值将是 nil。因此,无法区分显式传递参数 nil 和根本不传递参数。

历史上,不传递参数(即 nil 的参数)意味着模式将 切换

目前只有在交互式调用时才会切换模式,参数 nil 表示 "enable"。进行此更改是为了保证 启用 该模式 (add-hook 'prog-mode-hook 'some-minor-mode) 之类的东西——这将导致 some-minor-mode 被调用而不带任何参数。 =19=]