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.