And for what it's worth, I haaaate how condescending that site ( https://xyproblem.info/) is. It could be so much kinder.
On Sun, Jul 18, 2021 at 2:34 PM Cora Sutton <c...@sutton.me> wrote: > 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/CAMZDCY1D4fz9BXNrSQc%2BBXXmdSO%3DYLNc-5pmHQf-GHJFPyHDdg%40mail.gmail.com.