Brandon, Just a quick note to say that I conquered ConjunctiveList and have DisjunctiveList coded. After further tests to validate what it's doing, I'll post a gist to show the working code.
You were entirely right: using definterface and defrecord, I can construct these structures. Still a few tests to run. Many thanks Jack On Sat, Aug 15, 2020 at 2:28 PM Brandon R <brandon.ri...@gmail.com> wrote: > 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 > <https://groups.google.com/d/msgid/clojure/CAB_6y6GYJxQznBw8E6rxAjGoCvp9eh67OKuv2Z6v54FzA6-pRg%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/CAH6s0fz9d0%3DvY1yeUrwV2fd8%2B3Ufhbwnn1M9qNoBrg6wC2wKmA%40mail.gmail.com.