Hi Erik, I think that teasing things apart helps along some dimensions, but the problem I face, still thinking like a Java hacker, is that I need to put things together:
I need to construct a *type* (deftype) which honors two different interfaces, a list, and an evaluable object. I need the type because I want to create it, then add members to the list, and then one of: a) insert the object into another one (building and/or trees) b) evaluate it - when it is the root of the tree. Members in such lists can be either other evaluable lists, or they can be evaluable objects which perform computations - even with side effects - but which return a boolean. The several ideas posted in this thread are greatly helping me to see through this situation with fresh eyes, but, thus far, nothing has convinced me to drop the goal of creating a type which is a list and evaluable, into which I can insert conjunction or disjunction evaluators. Many thanks, Jack On Sat, Aug 15, 2020 at 12:14 AM Erik Assum <e...@assum.net> wrote: > 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 > <https://groups.google.com/d/msgid/clojure/cfac729f-b8e4-4f95-94b0-78345d10f457n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > -- > 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 > <https://groups.google.com/d/msgid/clojure/5B42B3BC-E20D-446E-82EF-0D1BFC36DA5F%40assum.net?utm_medium=email&utm_source=footer> > . > -- 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/CAH6s0fxkuHFOnWkJxAOytk5xHpYNR0FxvT0aF7A-783kTa3UmQ%40mail.gmail.com.