为什么一些?在Clojure中将false作为参数时返回true?

时间:2016-05-31 12:04:59

标签: function clojure functional-programming lisp clojurescript

我无法理解Clojure中某些?功能的意图。

我需要一些函数(内置),它在(nil或false)时返回false。

以下是示例:

(some? "1")
=> true

(some? nil)
=> false

(some? false) ;;Which is odd!!
=> true

5 个答案:

答案 0 :(得分:5)

查看some?的文档:

(some? x)

Returns true if x is not nil, false otherwise.

false绝对不是nil因此(some? false)会返回true

它是nil?

的补充
(= (some? x) (not (nil? x))

正如@delta建议的那样,您可以使用boolean检查某些内容是否不是nilfalse

答案 1 :(得分:4)

不知道为什么some?就是这样。但你要找的是boolean

  1. https://clojuredocs.org/clojure.core/boolean

答案 2 :(得分:1)

更简单,请使用IF

user=> (if "1" true false)
true
user=> (if nil true false)
false
user=> (if false true false)
false

答案 3 :(得分:1)

虽然有多种方法可以满足您的需求,但我认为最简单的方法是使用truthy?& falsey?函数from the Tupelo library

  

真相不明确

     

Clojure结合了Java和Lisp的世界。不幸的是,这两个   世界有不同的真理观,所以Clojure都接受了错误   并且为零。但是,有时候,你想强迫合乎逻辑   将值转换为字面值true或false值,因此我们提供了一种简单的方法   做到这一点:

(truthy? arg)
  Returns true if arg is logical true (neither nil nor false);
  otherwise returns false.

(falsey? arg)
  Returns true if arg is logical false (either nil or false);
  otherwise returns false. Equivalent to (not (truthy? arg)).

既然真的?和虚假?是函数(而不是特殊形式或宏),我们可以使用它们作为过滤参数或任何其他需要更高阶函数的地方:

(def data [true :a 'my-symbol 1 "hello" \x false nil] )

(filter truthy? data)
;=> [true :a my-symbol 1 "hello" \x]
(filter falsey? data)
;=> [false nil]

(is (every? truthy? [true :a 'my-symbol 1 "hello" \x] ))
(is (every? falsey? [false nil] ))

(let [count-if (comp count keep-if) ]
  (let [num-true    (count-if truthy? data)   ; <= better than (count-if boolean data)
        num-false   (count-if falsey? data) ] ; <= better than (count-if not     data)
    (is (and  (= 6 num-true)
              (= 2 num-false) )))))

答案 4 :(得分:0)

有效source for some?

(defn some? [x] (not (nil? x)))

最好将not-nil?称为booleanTupelo提供别名。

正如其他人所说,你正在寻找的功能是let f = function ...