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.