On Fri, Aug 14, 2020 at 8:44 PM Jack Park <jackp...@topicquests.org> wrote:
> This idea shows up early in Clojure text books. This concept comes to mind > rather quickly: > > (def and_list (ArrayList.) > ... > ) > > But, in the end it is an ArrayList which has an interface-defined > behavior, e.g. boolean eval(); (from Java) > Thus far, in a tiny VSCode project, I defined > > (definterface IEvaluable > (^boolean runIt [])) > > and defined a simple object which will return false and one which will > return true. I'll use those to populate a conjunctive and a disjunctive > list. > > Now I must define a list object which runs that interface. > > Still digging and experimenting, but, on the surface, this approach > appears to be possible. > > From above, as a sketch: > > (def and_list (ArrayList.) > IEvaluable > (runIt [this] > <some code to conditionally walk the list>)) > ) > > Meanwhile, I found this https://clojuredocs.org/clojure.core/proxy-super > which is now on the table to explore. > 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 On Fri, Aug 14, 2020 at 3:41 AM Jesús Gómez <jgo...@gmail.com> wrote: > >> Why not to Java-Interop with that Interface and those Classes directly, >> the same way you use them in Java? >> >> El jue., 13 ago. 2020 a las 22:54, Jack Park (<jackp...@topicquests.org>) >> escribió: >> >>> The problem: >>> >>> In Java, I have an interface *IInferrable* which is basically boolean >>> eval(); >>> >>> Any Java object which extends IInferrable, no matter what it is, will >>> answer to eval() and return a boolean. >>> The idea lies at the heart of an inference engine. >>> >>> But, I also define a class *AndList* which implements IInferrable and >>> extends java.util.ArrayList<Inferrable> >>> >>> So, AndList, and its sibling OrList behave just like a List object, but >>> also will answer to eval() by running the collection and dealing with what >>> each element returns when it, too, is eval()'d. >>> >>> I'd really love to discover how to pull that off in Clojure. >>> >>> Many thanks in advance. -Jack >>> >> -- 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/CACACo5Rj3U1CJdEy431j7EBpR4oOVccKoGtLjCRPdiKd%3DvgLTQ%40mail.gmail.com.