在Elisp中,我遇到了不同的API来建模布尔值。
我认为t
和nil
分别代表真假的惯用方式。但是,我也看到1
和-1
用于模拟同样的事情。
让我感到困惑的是,我遇到的API如果提供了nil
则不起作用,但如果使用-1
则会有效。
有人可以帮助我理解哪种方式实际上是首选方式。如果答案是t
和nil
,我欢迎任何有关为什么某些开发人员使用1
和-1
作为其API的理论......
答案 0 :(得分:9)
在lisp(Emacs Lisp和Common Lisp)中,唯一的错误值是nil
。
其他一切都是真的,包括0,-1& c& c。
Emacs使用否定参数(包括-1)来表示"关闭此模式"。例如, C-h f toggle-truncate-lines
使用前缀参数ARG,如果ARG为正,则截断长行, 否则折叠它们。
答案 1 :(得分:5)
sds和sepp2k已经涵盖了主要的误解,但回答:
为什么有些开发人员使用1和-1作为他们的API ...
Emacs次要模式使用正数和负数(或者说非正数,包括零)表示"启用"并且"禁用"而不是使用t
和nil
,参数是可选,并且当没有提供可选参数时,其值将是nil
。因此,不可能区分明确地传递nil
的参数,而根本不传递参数。
历史上,不传递任何参数(即nil
的参数)意味着该模式将切换。
这些天,只有在交互式调用模式时才会切换模式,nil
的参数表示"启用"。进行此更改是为了保证启用这种模式的(add-hook 'prog-mode-hook 'some-minor-mode)
- 这将导致some-minor-mode
被调用而没有参数。