布尔值的等价物是什么?在 Clojure 中

what is the equivalent of boolean? in Clojure

Scheme支持boolean?判断符号或值是否为boolean类型。

(boolean? #\t)
(boolean? #\f)

在 Clojure 中,我只能找到 integer?number?list? 等,但找不到 boolean?.

Clojure 中 boolean? 的等价物是什么?

你可以

(defn boolean? [x]
  (instance? Boolean x))

如果您身处类型领域,并且想知道某物是否为布尔值,那么正如 Shlomi 发布的那样,您可以从 instance? 轻松创建 boolean? 函数。这是可变参数版本:

(defn bools? 
  [& xs]
  (every? (partial instance? Boolean) xs))

输出:

>> (bools? true) => true
>> (bools? true false) => true
>> (bools? true nil) => false

我从来不需要这样做,因为我只处理过值以及 clojure 中的所有内容都是 "truthy" 除了 false 或 nil 的事实。

  • 在 Clojure 中,所有值都是逻辑值:if 的有效第一个参数 form 及其所有后代。从这个意义上说,一切都是布尔值。
  • 唯一的错误值是 nilfalse 本身。虽然
    Boolean/FALSE,一个包含 false 的静态对象,以及 (Boolean. false) - 一个包含 false 的新 Boolean 对象 - 求值 错误的。最后这与我阅读文档的方式不一致,但那是 Light Table 向我展示了什么。我会说避免构建你的 拥有 Booleans。为什么 Java 允许它,我无法理解。
  • 我从来没有遇到过需要知道逻辑的情况 集合中是否有东西 #{true false}。如果您需要这样做, 关注
  • 许多标准函数为 nothingfailure 生成 nil。为了 例如,应用于非成员的集合。在这种情况下,您可能会发现 你自己使用 nil? 来测试 nil,尤其是 false 将是一个有效且不同的值。

另一个版本:

(defn boolean? [x]
  (or (true? x) (false? x)))

(defn bool? [x] (= x (boolean x)))

因为 Clojure 1.9 there is a boolean? 谓词函数在 clojure.core 中。