Zwar gibt es mehr als einen Weg, um zu tun, was Sie fragen, ich denke, die einfachste die truthy?
& falsey?
Funktionen zu verwenden ist from the Tupelo library:
Die Wahrheit ist nicht mehrdeutig
Clojure heiratet die Welten von Java und Lisp. Leider haben diese zwei Welten unterschiedliche Vorstellungen von Wahrheit, so akzeptiert Clojure sowohl falsche und null als falsch. Manchmal jedoch wollen Sie logische Werte in wörtlichen wahr oder falsch Werte zwingen, so bieten wir eine einfache Art und Weise , das zu tun:
(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)).
Seit truthy? und falsch?sind Funktionen (anstelle von Sonderformen oder Makros), können wir sie als Argument verwenden können an jedem anderen Ort zu filtern oder dass eine höhere Ordnung Funktion erforderlich ist:
(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))))))
Das Interessante daran ist, dass 'Null' tut genau das gleiche wie 'einige?'. – S4M
@ S4M Nein, tut es nicht. '(nil? nil)' gibt 'true' zurück, während' (einige? nil) ''false' zurückgibt. –
@PiotrekBzdyl Sie haben recht, es ist '(nicht (nil? False))', die 'true' und' (not (nil? Nil)) zurückgibt, die 'false' zurückgibt. – S4M