(and true true) # => true
(and true false) # => false
(and true false nil) # => false
(and true nil false) # => nil
(and) # => true
(and true) # => true
(and 1) # => 1
(and 1 "hello") # => "hello"
(and [false] 1 "world") # => "world"
# note that `and` does not behave as you might expect
# when used with `apply` and `splice`:
(and 1 2 3) # => 3
(and (splice [1 2 3])) # => (1 2 3)
(apply and [1 2 3]) # => (if 1 (if 2 3 2) 1)
(eval (apply and [1 2 3])) # => 3
# if you need an `and` which you can feed to `apply`,
# you can use a reduce-based implementation:
(defn and2 [& xs]
(reduce
(fn [a b] (if (not a) a b))
true xs))
# however, note that `and2` does not implement short-circuiting:
# janet:23:> (and false (do (print "hello") true))
# false
# janet:24:> (and2 false (do (print "hello") true))
# hello
# false
# alternatively, you can use `all` for this case.
(all truthy? [true 0 1 'a :a "a" [] {}]) # => true
(all truthy? [true 0 nil 'a :a "a" [] {}]) # => nil
(all truthy? [true 0 false 'a :a "a" [] {}]) # => false
(apply (partial all truthy?) [[true 0 1 'a :a "a" [] {}]]) # => true
cellularmitosisPlayground