Hey Jack, Just been a fly on the wall for this convo, and aside from offering a specific solution, which others have done, I'm pretty certain this can be done with just protocols and records. Make a record (like your type) that implements the two protocols (like your interfaces). You could achieve your desired functionality without records and protocols but what you describe sounds like a fitting case for them.
Members in such lists can be either other evaluable lists, or they can be > evaluable objects which perform computations > A simple Clojure list/vector can hold any type of data you put into it. So your record can hold a vector of these things, which can be represented as Clojure data structure (lists / maps / etc). You say you *need* to construct a type, but I urge you to challenge this assumption, again and again if needed. I think it's natural to think you need a type because of coming from Java/OOP land, especially if you were there a long time. Old patterns die hard? I could be wrong though. :) My 2 cents, Brandon On Sat, Aug 15, 2020 at 12:42 PM Jack Park <jackp...@topicquests.org> wrote: > 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 > <https://groups.google.com/d/msgid/clojure/CAH6s0fxkuHFOnWkJxAOytk5xHpYNR0FxvT0aF7A-783kTa3UmQ%40mail.gmail.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/CAB_6y6GYJxQznBw8E6rxAjGoCvp9eh67OKuv2Z6v54FzA6-pRg%40mail.gmail.com.