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.