我无法理解Clojure中某些?功能的意图。
我需要一些函数(内置),它在(nil或false)时返回false。
以下是示例:
(some? "1")
=> true
(some? nil)
=> false
(some? false) ;;Which is odd!!
=> true
答案 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
检查某些内容是否不是nil
或false
。
答案 1 :(得分:4)
不知道为什么some?
就是这样。但你要找的是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)
(defn some? [x] (not (nil? x)))
最好将not-nil?
称为boolean
,Tupelo提供别名。
正如其他人所说,你正在寻找的功能是let f = function ...
。