2016-05-31 41 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年了!即使這樣,文檔也會使其看起來像是「投射」,直到您測試並驗證其所有行爲。 –

相關問題