No worries! Deep Java experience is such a huge asset when it comes to
Clojure, there's nothing to be ashamed of!

So, for reify, if I understand what you're attempting, I think you'd have
something like:

(reify
  ie4clj.api.Inferrable
  (evalMembers [members]
    (every? evalSelf members))))

Tha is, if evalSelf is really what you want there.

But, Jack, and I mean this in the kindest way possible, do you think it's
possible we have an XY situation going on here? https://xyproblem.info/

It's possible we're helping you solve the wrong thing and I'd love to be
sure we're pointing you down the best path possible. So, can I ask what
problem you're solving? Can you share more code somewhere, maybe in a
GitHub gist?

I just worry that maybe you're solving a problem the "Java way" when
there's an easier way to go about it in the "Clojure way".

Hope this is helpful!
Cora


On Sun, Jul 18, 2021 at 2:14 PM Jack Park <jackp...@topicquests.org> wrote:

> Thank you, Cora. That's awesome, and it opens new issues for me. Here is
> my revised code from your first level comment
> (defn AndList
>   [members]
>   (reify
>     ie4clj.api.Inferrable
>     (every? evalSelf members)
>
>     ))
> Which opens new issues:
>
>    - Right at "(reify" I get this error message
>
> Syntax error (IllegalArgumentException) compiling at
> (ie4clj/AndList.clj:8:3).
> Don't know how to create ISeq from: clojure.lang.Symbol
> It's as if the ability to reify an interface is not recognized
> Notice there is an interface call which, itself, is not :require'd
> evalSelf, which leads to
>
>    - evalSelf is not recognized
>
> That one is beginning to suggest to me that I should, instead, not use an
> interface, but just write code which can use clojure's eval.
> But, I've been creating classes, not functions. If I modify my code such
> that the members sequence contains functions, then perhaps that would work.
>
> I confess, I'm saddled with a deep java experience.
> Your coaching is extremely helpful.
> Many thanks
> Jack
>
> On Sun, Jul 18, 2021 at 11:23 AM Cora Sutton <c...@sutton.me> wrote:
>
>> Hi Jack!
>>
>> I could be wrong but I think this could just be: (every? eval members)
>>
>> I see a few things here that seem strange to me so I wanted to share a
>> few points that might be helpful (or might not, let me know either way) for
>> future code.
>>
>> * So typically you don't want to def or defn within another function call
>> since that will define a new value at the top level.
>>
>> (defn foo []
>>   (def bar 1)
>>   (println (inc bar))
>>
>> (foo)
>> ;; ^^ calling foo will define bar at the top level
>>
>> bar
>> ;; => 1
>> ;; whoops, didn't mean to have that at the top level like that
>> ;; imagine if two different threads called that in parallel ::grimace::
>>
>> Instead, you usually want to use the let function:
>> https://clojuredocs.org/clojure.core/let
>>
>> So in your code you might use this something like:
>>
>> (let [result (atom true)]
>>   ....)
>>
>> The error you're seeing is from the (defn result ...) in your code,
>> you're missing the argument vector [] after result -- so it would look
>> like (defn result [] (atom true)) -- but you really don't want to defn
>> like that, I think.
>>
>> * To update an atom's value you don't want to assign like that, you want
>> to use swap! https://clojuredocs.org/clojure.core/swap!
>>
>> (swap! f
>>        (fn [cur-val new-val] (and cur-val new-val))
>>        (eval member))
>>
>> * You probably don't want to use an atom here. Atoms are usually for data
>> that you intend to have multiple threads accessing. In this case it's just
>> a value that changes during a single thread's execution here.
>>
>> How else could you solve this if not for the very convenient every?
>> function? There are a bunch of ways! Here are a few, with things written
>> out pretty explicitly so they're more clear.
>>
>> loop/recur:
>>
>> (loop [result true
>>        remaining-members members]
>>   (let [member (first remaining-members)
>>         remaining-members (rest members)
>>         new-result (eval member)]
>>     (if new-result
>>       (recur true remaining-members)
>>       false)))
>>
>> reduce v1:
>>
>> (reduce (fn [result member]
>>           (and result
>>                (eval member)))
>>         true
>>         members)
>>
>> reduce v2.0, that will now stop iterating once one of the members evals
>> to false:
>>
>> (reduce (fn [_ member]
>>           (or (eval member)
>>               (reduced false)))
>>         true
>>         members)
>>
>> My point with sharing these is that in clojure usually the best way to
>> solve these problems is to pass new values to the next iteration while
>> accumulating a result instead of changing a variable on each iteration. Or
>> to use one of these sweet built-in functions.
>>
>> Does that make sense?
>>
>> * I thiiiiiiink you might not mean eval but I'm interested in what kind
>> of problem you're solving! :)
>>
>> Hope that helps!
>> Cora
>>
>> On Sun, Jul 18, 2021 at 12:41 PM Jack Park <jackp...@topicquests.org>
>> wrote:
>>
>>> I have a class which treats a sequence as a conjunctive list of objects
>>> which, when evaluated, return a boolean.  It is an attempt to use doseq to
>>> walk along that list, evaluating each entry, and anding that result with
>>> boolean atom. It fails. A sketch of the code is this - taken from the error
>>> message:
>>>
>>> inside (defn AndList...
>>>
>>> (reify
>>>     ie4clj.api.Inferrable
>>>     (defn evalMembers
>>>         [members]
>>>         (defn result (atom true))
>>>         (doseq [x members]
>>>             (result = (and result (eval x))))
>>>         (println (clojure.core/deref result))
>>>     (result))) - *failed: vector? at: [:fn-tail :arity-1 :params] spec:
>>> :clojure.core.specs.alpha/param-list*
>>>
>>> It could be that my Java background is clouding my use of clojure. Any
>>> comments will be appreciated.
>>>
>>> Thanks
>>> 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/f67cfcd0-8e1e-4780-bc00-f6993979e7afn%40googlegroups.com
>>> <https://groups.google.com/d/msgid/clojure/f67cfcd0-8e1e-4780-bc00-f6993979e7afn%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/CAMZDCY3BWybiXzgoYaKK958z%2BWqTKf0o_5p9fq-huwutco9onw%40mail.gmail.com
>> <https://groups.google.com/d/msgid/clojure/CAMZDCY3BWybiXzgoYaKK958z%2BWqTKf0o_5p9fq-huwutco9onw%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/CAH6s0fywhEidRkLx8DytqEs5wtXOaFtULCkBWgW%2BRVpmSfQvjg%40mail.gmail.com
> <https://groups.google.com/d/msgid/clojure/CAH6s0fywhEidRkLx8DytqEs5wtXOaFtULCkBWgW%2BRVpmSfQvjg%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/CAMZDCY2MNvTJaKEWYNWj-WUvCmRRceLP7zpfwqjR--RKKMj9Lg%40mail.gmail.com.

Reply via email to