2016-05-31 42 views
1

我无法理解的一些意图吗?在Clojure中的功能。为什么有些?在Clojure中将参数设为false时返回true?

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

这里是例子:

(some? "1") 
=> true 

(some? nil) 
=> false 

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

有趣的是,'零'呢和'some?'完全一样。 – S4M

+1

@ S4M不,它没有。 '(nil?nil)'返回'true',而'(some?nil)'返回'false'。 –

+0

@PiotrekBzdyl你说得对,它是'(not(nil?false))'返回'true'和'(not(nil?nil))'返回'false'。 – S4M

回答

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的补充。

+5

我会补充一点,在语义上'some?'完全对应于它的标题,这意味着它检查,该值是* something *,而只有'nil'在clojure中被认为是* nothing。很明显,“假”是某种东西。所以这种行为没有什么奇怪的。 – leetwinski

+0

@leetwinski然而,人们常常会感到困惑,因为在谓词返回的“某些”逻辑真值(即非假)被视为匹配。尽管如此,命名也是一致的,他说:“给我一些匹配谓词的元素”。另外'some->'的命名是一致的,它又将“false”当作“some?”来处理。 –

+1

确实..我宁愿将它命名为“某事?”真的......但是...... Rich知道得更好) – leetwinski

0

有效source for some?

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

倒不如称为not-nil?,这Tupelo报价别名。

正如其他人所说,您正在寻找的功能是boolean

1

就更简单了,使用IF

user=> (if "1" true false) 
true 
user=> (if nil true false) 
false 
user=> (if false true false) 
false 
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)). 

由于truthy?和虚伪?是功能(而不是特殊形式或宏),我们可以用它们作为参数来筛选或任何其他地方所需要高阶功能:

(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)))))) 
+0

我认为所需的函数是'truthy?',而不是'falsey?'。 – Thumbnail

+0

考虑到逻辑真理在所有条件形式中都受到语言本身的尊重,所以我认为这些谓词的可读性至多99.99%。 “假?”完全是“不”。 IDK是keep-if的impl,但考虑惯用的'(过滤器身份数据)','(过滤器不是数据)' - 我不低估这一点,因为这是通过SICP风格的上下文重定义来增加可读性的好例子,但它会为了学习的目的,如果你在这里提供了单行实现而不是链接到它,那会更好。 –

+0

你是正确的,主要目的是可读性,以便代码文本更真实地说明它打算做什么。这对于学习Clojure的人特别有用。使用'not'不难读,但是不存在与“truthy?”相反的情况。当然,因为它是一种特殊的形式,所以不能使用if。因此,薄包装fn的'truthy?'和'falsey?'强制为'true' /'false'。虽然'boolean'有效,但在我注意到它之前,我已经使用了Clojure 2年了!即使这样,文档也会使其看起来像是“投射”,直到您测试并验证其所有行为。 –

相关问题