Why not tease things apart?

(defn eval [x] ...)

(some eval my-list) ;; or list
(every? eval my-list) ;; and list

https://clojuredocs.org/clojure.core/some
https://clojuredocs.org/clojure.core/every_q

Now, you can make the eval function polymorphic in several ways, simplest is to 
case or cond on some property of x. You could also use multimethods or a 
protocol to achieve this. 

https://insideclojure.org/2015/04/27/poly-perf/

Erik. 
-- 
i farta

> 15. aug. 2020 kl. 02:04 skrev matthew...@gmail.com 
> <matthewdowne...@gmail.com>:
> 
> 
> 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.

-- 
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/5B42B3BC-E20D-446E-82EF-0D1BFC36DA5F%40assum.net.

Reply via email to