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.

Reply via email to