【问题标题】:ANDing a boolean and a listANDing 一个布尔值和一个列表
【发布时间】:2016-11-17 17:08:37
【问题描述】:

我注意到在 Scheme、Racket 和 Clojure 中,表达式(在此处使用 Clojure)(and true '()) 的计算结果为 ()(and '() true) 的计算结果为 true。这不仅适用于空列表,也适用于任何列表。

但在 GNU CLISP 和 Emacs Lisp 中,(and t '()) 的计算结果为 nil(and '() t) 的计算结果也为 nil,但 (and t '(1 2 3)) 的计算结果为 (1 2 3)(and '(1 2 3) t) 的计算结果为 t

这是怎么回事?

【问题讨论】:

    标签: clojure scheme common-lisp elisp racket


    【解决方案1】:

    在第一组语言中,空列表不被视为“虚假”,而是被视为“真实”值。在方案和球拍中,#false 是唯一的 false 值,因此即使 '() 为 null,null 也不是 false;在 clojure 中,空列表与 nil 不同,因此它也是“真实的”。

    在第二组中,空列表是nil 的同义词,被视为假,导致条件返回nil。然而,带有元素的列表与 nil 不同,因此再次被视为真值。

    最后一个难题是and 在所有传递的值都是真实的情况下返回最后一个真实值。

    【讨论】:

    • 但在 Scheme 和 Racket 中,(null? '()) 是真的。在 Clojure 中,(nil? '()) 确实是错误的。
    • @clementi 在 Scheme 和 Racket 中,null'() 的值相同,但它 (1) 是真实的,并且 (2) 打印为 ()'()。在 CL 和 elisp 中,nil'() 的值相同,但 (1) 它是虚假的,并且 (2) 它打印为 nil,而不是 ()
    • @clementi 更新了我的答案;亚历克西斯完全正确。
    • nullnil 非常不同。在 Racket 中,null 表示空列表,仅此而已;它不是布尔值,所以它是一个“真实”的值。在 Clojure nil 中,not 表示空列表吗?它更接近 void 值,因此空列表在那里也是“真实的”。除了这些之外的许多 lisp 让 nil 非常困惑(在我看来),同时使其成为一个列表、一个布尔值和一个符号。
    【解决方案2】:

    在 Clojure 中,只有 falsenil 被视为逻辑错误。其他一切都被认为是逻辑正确的。

    在你提到的其他 Lisps 中,空列表在逻辑上被认为是错误的。

    【讨论】:

      【解决方案3】:

      and 运算符评估参数并将结果“短路”,即一旦一个参数为假,它就会返回 nil。否则,它返回最后一个值。 行为上的区别在于,在 Common Lisp 中,空列表与 nil 相同,即为 false,因此,(and '() t) 与返回 nil(and nil t) 相同。

      【讨论】:

        猜你喜欢
        • 2021-09-29
        • 2020-10-25
        • 2018-05-13
        • 1970-01-01
        • 2023-04-05
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        相关资源
        最近更新 更多