【问题标题】:Boolean values: t vs. nil vs 1 vs -1布尔值:t vs. nil vs 1 vs -1
【发布时间】:2018-03-19 19:17:20
【问题描述】:

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

我的印象是tnil 分别是表示真假的惯用方式。但是,我也看到 1-1 用于建模相同的东西。

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

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

【问题讨论】:

  • "我知道 1 和 -1 可以在真假上下文中使用以达到相同的效果" 不,他们不能。 1 和 -1 都是真实的。事实上,除了nil 之外的一切都是真实的。

标签: lisp elisp


【解决方案1】:

Lisp

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

Emacs

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

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

【讨论】:

    【解决方案2】:

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

    为什么有些开发者在他们的 API 中使用 1 和 -1...

    Emacs 次要模式使用正数和负数(或者更确切地说是非正数,包括零)来表示“启用”和“禁用”,而不是使用 tnil 的原因是参数是可选的,当没有提供可选参数时,它的值将是nil。因此,无法区分显式传递 nil 的参数和根本不传递参数。

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

    如今,模式仅在交互调用时才会切换,nil 的参数表示“启用”。进行此更改是为了保证(add-hook 'prog-mode-hook 'some-minor-mode) 之类的东西——这将导致在没有参数的情况下调用some-minor-mode——保证启用该模式。

    【讨论】:

    • 所以次要模式不能通过简化集some mode -1来启用或禁用?
    • @Alice,(foo-mode 1) 启用模式,(foo-mode -1) 禁用模式。 (这就是你要问的吗?)
    • 如果你想让非交互式 elisp 代码 toggle 成为次要模式,你可以传递参数'toggle(这比建立模式并传递反参数)。
    • 太棒了,所以除了init.el之外不用修改其他文件
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多