Another option would be to do what Alex is suggesting and define and as a 
function. Just because it’s a macro in clojure.core doesn’t mean you can’t 
write your own :)

(defn eval' [x]
  (if (map? x)
    (apply (:fn x) (:coll x))
    x))

(defn and-list [& items]
  (let [if? (fn [x] (if x true false))
        and' (fn [& args] (every? if? args))]
    {:fn and' :coll items}))

(eval' true) ;=> true
(eval' false) ;=> false
(eval' (and-list 1 2 3)) ;=> true
(eval' (and-list 1 2 3 false)) ;=> false

Ditto with or. 
On Friday, August 14, 2020 at 4:27:19 PM UTC-5 jack...@topicquests.org 
wrote:

> Alex,
>
> I plan to explore this idea.
> Many thanks!
>
> Jack
>
> On Fri, Aug 14, 2020 at 1:38 PM Oleksandr Shulgin <oleksand...@zalando.de> 
> wrote:
>
>> <snip.>
>>
>>
>> Nevermind transducers: I've just realized that reduced can be used with 
>> the normal reduce.  E.g. here's short-circuiting AND-reduction fn:
>>
>> (defn andr
>>   ([] true)
>>   ([i] i)
>>   ([r i] (let [o (and r i)]
>>            (if o
>>              o
>>              (reduced o)))))
>>
>> When it comes to the actual lists, it depends how you'd like to represent 
>> them.  E.g. I could imagine something like the following can be a useful 
>> notation:
>>
>> [:and 1 2 [:or 3 4] 5]
>>
>> or even more direct:
>>
>> (quote (and 1 2 (or 3 4) 5))
>>
>> If you really want an interface-like look and feel, then protocols might 
>> be the right answer:
>>
>> (defprotocol Evaluable
>>   (evaluate [this]))
>>
>> (defrecord AndList [items]
>>   Evaluable
>>   (evaluate [this]
>>     (reduce andr (:items this))))
>>
>> user> (evaluate (->AndList [1 2 3]))
>> 3
>> user> (evaluate (->AndList [1 false 3]))
>> false
>>
>> To complete it, you'll need to add the OrList and sneak (map evaluate) in 
>> the reduce call in both And- and OrList.
>>
>> Cheers,
>> --
>> Alex
>>
> <snip>
>>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/clojure/cfac729f-b8e4-4f95-94b0-78345d10f457n%40googlegroups.com.

Reply via email to