我無法理解的一些意圖嗎?在Clojure中的功能。爲什麼有些?在Clojure中將參數設爲false時返回true?
我需要一些函數(內置),它需要(無或假)時返回false。
這裏是例子:
(some? "1")
=> true
(some? nil)
=> false
(some? false) ;;Which is odd!!
=> true
我無法理解的一些意圖嗎?在Clojure中的功能。爲什麼有些?在Clojure中將參數設爲false時返回true?
我需要一些函數(內置),它需要(無或假)時返回false。
這裏是例子:
(some? "1")
=> true
(some? nil)
=> false
(some? false) ;;Which is odd!!
=> true
檢查的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
的補充。
我會補充一點,在語義上'some?'完全對應於它的標題,這意味着它檢查,該值是* something *,而只有'nil'在clojure中被認爲是* nothing。很明顯,「假」是某種東西。所以這種行爲沒有什麼奇怪的。 – leetwinski
@leetwinski然而,人們常常會感到困惑,因爲在謂詞返回的「某些」邏輯真值(即非假)被視爲匹配。儘管如此,命名也是一致的,他說:「給我一些匹配謂詞的元素」。另外'some->'的命名是一致的,它又將「false」當作「some?」來處理。 –
確實..我寧願將它命名爲「某事?」真的......但是...... Rich知道得更好) – leetwinski
就更簡單了,使用IF:
user=> (if "1" true false)
true
user=> (if nil true false)
false
user=> (if false true false)
false
雖然有做你所要求的方法不止一種,我覺得最簡單的就是使用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))))))
我認爲所需的函數是'truthy?',而不是'falsey?'。 – Thumbnail
考慮到邏輯真理在所有條件形式中都受到語言本身的尊重,所以我認爲這些謂詞的可讀性至多99.99%。 「假?」完全是「不」。 IDK是keep-if的impl,但考慮慣用的'(過濾器身份數據)','(過濾器不是數據)' - 我不低估這一點,因爲這是通過SICP風格的上下文重定義來增加可讀性的好例子,但它會爲了學習的目的,如果你在這裏提供了單行實現而不是鏈接到它,那會更好。 –
你是正確的,主要目的是可讀性,以便代碼文本更真實地說明它打算做什麼。這對於學習Clojure的人特別有用。使用'not'不難讀,但是不存在與「truthy?」相反的情況。當然,因爲它是一種特殊的形式,所以不能使用if。因此,薄包裝fn的'truthy?'和'falsey?'強制爲'true' /'false'。雖然'boolean'有效,但在我注意到它之前,我已經使用了Clojure 2年了!即使這樣,文檔也會使其看起來像是「投射」,直到您測試並驗證其所有行爲。 –
有趣的是,'零'呢和'some?'完全一樣。 – S4M
@ S4M不,它沒有。 '(nil?nil)'返回'true',而'(some?nil)'返回'false'。 –
@PiotrekBzdyl你說得對,它是'(not(nil?false))'返回'true'和'(not(nil?nil))'返回'false'。 – S4M