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 [email protected]
wrote:
> Alex,
>
> I plan to explore this idea.
> Many thanks!
>
> Jack
>
> On Fri, Aug 14, 2020 at 1:38 PM Oleksandr Shulgin <[email protected]>
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/clojure/cfac729f-b8e4-4f95-94b0-78345d10f457n%40googlegroups.com.