2015-04-12 72 views
4

Scheme支持boolean?来测试符号或值是否为布尔类型。什么是布尔等价物?在Clojure中

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

虽然Clojure中,我只能发现integer?number?list?等,但没有boolean?

Clojure中什么是boolean?

+3

请记住,“真”不是唯一的真值,“假”不是唯一的假值。你可能知道这一点。这只是一个警告新手阅读此后。 – Mars

回答

10

你可以做

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

如果你的类型的土地的时候,并想知道如果事情是一个布尔值,那么作为施洛米已经发布,你可以从instance?做出boolean?功能很轻松了。这里有一个可变参数版本:

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

与输出:

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

我从来没有需要做到这一点,因为我只曾经处理了价值,事实上,一切都在Clojure是“truthy “除了虚假或零。

4
  • 在Clojure中,所有的值都是逻辑的:对if form及其后代有效的第一个参数。从这个意义上说,一切都是布尔型的。
  • 唯一的虚假值是nilfalse本身。虽然
    Boolean/FALSE,一个静态对象包含false(Boolean. false) - 一个新的Boolean对象包含false - 评估 false。这最后不符合我如何阅读文档,但那是Light Table向我展示的 。我会说避免构建你的 自己的Boolean s。为什么Java允许它,我无法理解。
  • 我从来没有遇到过一个案例,其中逻辑需要知道 是否在集合#{true false}。如果您需要这样做, 请按照Shlomi's advice
  • 许多标准功能产生nil没有失败。例如,对于 示例,一组应用于非成员。在这种情况下,您可能会发现自己使用nil?来测试nil,特别是其中false 将是有效且不同的值。
+0

虽然通常对此的需求看起来并不合理,但如果要将一个命令行选项(如调试标志)输入到该程序,则需要执行此操作的一种情况。在这种情况下,编码员会希望确保用户明确设定真实价值,并且不会偶然提供一些非错误价值。 – Don

8

另一个版本:

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

有没有可以使该函数返回false的x值?我会认为不管你给它什么,它都会回归真实。假是虚假的,空是虚假的,你可以给它的一切都是真实的。 –

+2

除了Boolean.TRUE和Boolean.FALSE之外的每个值都会使此函数返回false。阅读真实的文档?和假?它们完全是为了将真实与真正的布尔值区分开来。 –

+1

这很好,也适用于Clojurescript(我只是在cljs和clj REPL中测试过)。 –

1

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

相关问题