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.

Reply via email to