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

时间:2018-03-19 19:17:20

标签: lisp elisp

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

我认为tnil分别代表真假的惯用方式。但是,我也看到1-1用于模拟同样的事情。

让我感到困惑的是,我遇到的API如果提供了nil则不起作用,但如果使用-1则会有效。

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

2 个答案:

答案 0 :(得分:9)

Lisp的

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

的Emacs

Emacs使用否定参数(包括-1)来表示"关闭此模式"。例如, C-h f toggle-truncate-lines

  

使用前缀参数ARG,如果ARG为正,则截断长行,   否则折叠它们。

答案 1 :(得分:5)

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

  

为什么有些开发人员使用1和-1作为他们的API ...

Emacs次要模式使用正数和负数(或者说非正数,包括零)表示"启用"并且"禁用"而不是使用tnil,参数是可选,并且当没有提供可选参数时,其值将是nil。因此,不可能区分明确地传递nil的参数,而根本不传递参数。

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

这些天,只有在交互式调用模式时才会切换模式,nil的参数表示"启用"。进行此更改是为了保证启用这种模式的(add-hook 'prog-mode-hook 'some-minor-mode) - 这将导致some-minor-mode被调用而没有参数。