So, that did the trick. No more defs or atoms, a few tweeks, and it ran. naming conventions brought into line with clojure.
Next step is to prove it can return a false, and then continue adding features. Many thanks to all, and particularly to Tanya for reviewing my code. On Mon, Jul 19, 2021 at 12:36 AM Tanya Moldovan <tanya.moldo...@gmail.com> wrote: > I think you forgot to link it, but I think I found it > <https://gist.github.com/KnowledgeGarden/572ab649c9266e0f804c93ff4ba2c43c> > :) > > You don't really need line 11. It will run without it. > Don't use defs inside a function. Use let. Always. > Don't use atoms inside a function. In fact, unless you need some shared > state between processes - just don't use them. Same goes for refs. > > (I changed the name of function to be more clojure like (ie: SimpleTrue -> > simple-true and so on) > > It's not clear what you want to do with the SimpleTrue, SimpleFalse. Do > you need it to be a list? Or a boolean value? > If boolean - then do this: > > (defn simple-true [] true) > (defn simple-false [] false) > (defn not-simple-true [] (not simple-true)) > (defn not-simple-false [] (not simple-false)) > > If you need a list, just do: > > (defn simple-true [] '(true)) ;<--- notice the quote before the parenthesis > (defn simple-true [] [true]) ; or just use vectors > > In clojure, if you need lists, always put a quote before the parenthesis, > otherwise it will be interpreted as a function. > So (true) will throw an exception, but '(true) will work: > > ie4clj.core=> (true) > Execution error (ClassCastException) at ie4clj.core/eval1490 > (form-init3173779095201492457.clj:1). > java.lang.Boolean cannot be cast to clojure.lang.IFn > > ie4clj.core=> '(true) > (true) > > > Another place where it will throw an error is line 41 > > (@x) > > Do you want to return the result as a list or just return the result? > If you want a list you do this: > > '(@x) ; <-- notice the quote > [@x] ; or use vector > > If you want to return a result just do this: > > @x > > Also, don't use atoms ) > > On line 37 you are assigning the result of let to that atom, BAL2 will be > the same as BAL1, so you can just skip it and return the result from let. > Like this: > > (defn build-and-list [] > (println "BAL") > (let [result (flatten (list simple-true simple-false))] ;<-- actually not > sure if this is the thing you want here. This will be a list of functions. > (println "BAL1" result ) > result)) > > > Another thing is with the test function. Don't use defs there, just use a > let clause, like this: > > (defn first-test [] > (println "First Test") > (let [x (evaluate-and [(constantly true) (constantly true)]) > y (evaluate-and [(constantly true) (constantly false)]) > l (build-and-list) > result (evaluate-and l)] > (println "A" x) > (println "B" y) > (println "C" l) > (println "bar" result) > result)) > > And here is the evaluate-and function with let instead of def. > > (defn evaluate-and > [members] > (println "EA" members) > (let [result (every? (fn [member] (member)) members)] > (println "EA+" result) > result)) ;<-- I added this line, as (println) one return nil, and I > thought you needed the result true or false (?) > > This compiles and runs for me (unless I forgot something). (if it doesn't > just tell me, I'll commit the code so you can play with it) > > > On Mon, 19 Jul 2021 at 05:16, Jack Park <jackp...@topicquests.org> wrote: > >> Cora, I agree. A gist was just submitted here. I'm in the clojurians >> slack; I have a weak memory of being there once before. But, happy to put a >> summary of this in #beginners as you suggest. >> >> >> >> On Sun, Jul 18, 2021 at 8:13 PM Cora Sutton <c...@sutton.me> wrote: >> >>> Code would be helpful for sure! Also, it might be time to move this to >>> Clojurians Slack http://clojurians.net/ >>> >>> There is a #beginners channel where volunteers are available to help in >>> a more synchronous fashion which might help get to the bottom of this a bit >>> quicker. >>> >>> On Sun, Jul 18, 2021 at 10:00 PM Tanya Moldovan < >>> tanya.moldo...@gmail.com> wrote: >>> >>>> Hey, >>>> >>>> Could you share the code you have now? >>>> >>>> On Mon, 19 Jul 2021, 02:18 Jack Park, <jackp...@topicquests.org> wrote: >>>> >>>>> Cora! >>>>> >>>>> I made those changes. It is still working to the degree it was, with >>>>> the same error >>>>> clojure.lang.LazySeq cannot be cast to clojure.lang.IFn >>>>> >>>>> >>>>> which, according to the intertubes, means that my buildAndList returns >>>>> (value) instead of value. I tried flatten. No cigar. >>>>> >>>>> Thanks >>>>> Jack >>>>> On Sun, Jul 18, 2021 at 5:00 PM Cora Sutton <c...@sutton.me> wrote: >>>>> >>>>>> Hello again Jack, >>>>>> >>>>>> On Sun, Jul 18, 2021 at 6:21 PM Jack Park <jackp...@topicquests.org> >>>>>> wrote: >>>>>> >>>>>>> (every? eval members) does not appear to work on a list of >>>>>>> functions designed to evaluate to a boolean. >>>>>>> >>>>>> >>>>>> If members is a list of functions then you would do: >>>>>> >>>>>> (every? (fn [member] (member)) members) >>>>>> >>>>>> Showing it work here: >>>>>> >>>>>> (every? (fn [member] (member)) [(constantly true) (constantly true)]) >>>>>> ;; => true >>>>>> (every? (fn [member] (member)) [(constantly true) (constantly false)]) >>>>>> ;; => false >>>>>> >>>>>> >>>>>>> That code is used in a function evaluateAnd >>>>>>> >>>>>>> Two simple tests >>>>>>> (evaluateAnd [true true] --> true >>>>>>> (evaluateAnd [true false] --> nil (why not "false" as the every? >>>>>>> examples show?) >>>>>>> >>>>>> >>>>>> In Clojure things are either "truthy" or "falsey", and the only >>>>>> "false" values are false and nil so returning nil is usually fine. >>>>>> Everything else is "truthy". I wouldn't worry about it returning nil >>>>>> since >>>>>> other things were broken anyways. >>>>>> >>>>>> https://clojure.org/guides/learn/flow#_truth >>>>>> >>>>>> >>>>>>> The specific code for building the list of functions is this >>>>>>> >>>>>>> (def x (atom [])) >>>>>>> (let [result (list (ref SimpleTrue) (ref SimpleFalse))] >>>>>>> (println "BAL1" result ) >>>>>>> (reset! x result) >>>>>>> ) >>>>>>> (println "BAL2" @x ) >>>>>>> >>>>>>> (@x) <<<< returns the atom's value >>>>>>> >>>>>>> And the final println is this >>>>>>> >>>>>>> BAL2 (#object[clojure.lang.Ref 0x335b5620 {:status :ready, :val >>>>>>> #object[ie4clj.Tests$SimpleTrue 0x6eb2384f >>>>>>> ie4clj.Tests$SimpleTrue@6eb2384f]}] >>>>>>> #object[clojure.lang.Ref 0x3c9c0d96 {:status :ready, :val >>>>>>> #object[ie4clj.Tests$SimpleFalse 0x31dadd46 >>>>>>> ie4clj.Tests$SimpleFalse@31dadd46]}]) >>>>>>> >>>>>>> evaluateAnd never saw the result, with this error message >>>>>>> >>>>>>> clojure.lang.PersistentList cannot be cast to clojure.lang.IFn >>>>>>> >>>>>> >>>>>> Refs are the wrong thing to use here. In fact I'd stay away from >>>>>> atoms and refs unless you have multiple threads that need to mutate the >>>>>> same values. They're just confusing things now, I think. >>>>>> >>>>>> >>>>>>> >>>>>>> The test which fails is this >>>>>>> >>>>>>> (def result (evaluateAnd (buildAndList) )) <<< fails here >>>>>>> (println "bar" result) >>>>>>> (result) >>>>>>> >>>>>>> The googleverse seems to agree that there are extra parens around >>>>>>> the value. Google isn't giving me an obvious way to take that value >>>>>>> outside >>>>>>> of its surrounding parens (bal2 above). >>>>>>> Still looking, and hoping that solves the problem. >>>>>>> Maybe there's a way to go back to buildAndList and not return the >>>>>>> value with parens. >>>>>>> >>>>>> >>>>>> I think a key thing to explain is that in Clojure generally you're >>>>>> not making new types of collections. There's this famous-ish saying that >>>>>> Clojure holds to pretty well: >>>>>> >>>>>> "It is better to have 100 functions operate on one data structure >>>>>> than 10 functions on 10 data structures." >>>>>> - Alan Perlis >>>>>> >>>>>> Most functions in the Clojure world operate on a handful of basic >>>>>> data types and structures. This makes it really easy to chain and combine >>>>>> functions to slice and dice data since you don't need to convert between >>>>>> types. >>>>>> >>>>>> I don't think I've ever made a special collection type in Clojure, >>>>>> it's not all that common. So I'd suggest that while you're at this point >>>>>> in >>>>>> your journey you try to stick to the built-in Clojure collection types >>>>>> and >>>>>> use the built-in functions to operate on them. >>>>>> >>>>>> To give you a little direction, instead of a Person object you could >>>>>> make a hashmap like {:first-name "Jack" :last-name "Park"} and pass >>>>>> that around. And then you can make a function that operates on that. >>>>>> >>>>>> (defn full-name >>>>>> [person] >>>>>> (str (get person :first-name) " " (get person :last-name))) >>>>>> >>>>>> And then you could expand that to maybe {:first-name "Jack" >>>>>> :last-name "Park" :people-talked-to-on-mailing-list ["Cora Sutton"]} and >>>>>> then operate on a collection of people like: >>>>>> >>>>>> (defn people-talked-to-on-mailing-list >>>>>> [person all-people] >>>>>> (let [people-to-find (set (get person >>>>>> :people-talked-to-on-mailing-list))] >>>>>> (filter (fn [p] >>>>>> (people-to-find (full-name p)) >>>>>> all-people)) >>>>>> >>>>>> (people-talked-to-on-mailing-list jack all-people) >>>>>> ;; => {:first-name "Cora" :last-name "Sutton" >>>>>> :people-talked-to-on-mailing-list ["Jack Park"]} >>>>>> >>>>>> >>>>>> >>>>>>> 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/CAH6s0fwv-rKrWnXji_r4scaX9_jtAi1CRUWGLLNRj7iZtme4UA%40mail.gmail.com >>>>>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fwv-rKrWnXji_r4scaX9_jtAi1CRUWGLLNRj7iZtme4UA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> >>>>>> >>>>>> On Sun, Jul 18, 2021 at 6:21 PM Jack Park <jackp...@topicquests.org> >>>>>> wrote: >>>>>> >>>>>>> (every? eval members) does not appear to work on a list of >>>>>>> functions designed to evaluate to a boolean. >>>>>>> >>>>>>> That code is used in a function evaluateAnd >>>>>>> >>>>>>> Two simple tests >>>>>>> (evaluateAnd [true true] --> true >>>>>>> (evaluateAnd [true false] --> nil (why not "false" as the every? >>>>>>> examples show?) >>>>>>> >>>>>>> The specific code for building the list of functions is this >>>>>>> >>>>>>> (def x (atom [])) >>>>>>> (let [result (list (ref SimpleTrue) (ref SimpleFalse))] >>>>>>> (println "BAL1" result ) >>>>>>> (reset! x result) >>>>>>> ) >>>>>>> (println "BAL2" @x ) >>>>>>> >>>>>>> (@x) <<<< returns the atom's value >>>>>>> >>>>>>> And the final println is this >>>>>>> >>>>>>> BAL2 (#object[clojure.lang.Ref 0x335b5620 {:status :ready, :val >>>>>>> #object[ie4clj.Tests$SimpleTrue 0x6eb2384f >>>>>>> ie4clj.Tests$SimpleTrue@6eb2384f]}] >>>>>>> #object[clojure.lang.Ref 0x3c9c0d96 {:status :ready, :val >>>>>>> #object[ie4clj.Tests$SimpleFalse 0x31dadd46 >>>>>>> ie4clj.Tests$SimpleFalse@31dadd46]}]) >>>>>>> >>>>>>> evaluateAnd never saw the result, with this error message >>>>>>> >>>>>>> clojure.lang.PersistentList cannot be cast to clojure.lang.IFn >>>>>>> >>>>>>> The test which fails is this >>>>>>> >>>>>>> (def result (evaluateAnd (buildAndList) )) <<< fails here >>>>>>> (println "bar" result) >>>>>>> (result) >>>>>>> >>>>>>> The googleverse seems to agree that there are extra parens around >>>>>>> the value. Google isn't giving me an obvious way to take that value >>>>>>> outside >>>>>>> of its surrounding parens (bal2 above). >>>>>>> Still looking, and hoping that solves the problem. >>>>>>> Maybe there's a way to go back to buildAndList and not return the >>>>>>> value with parens. >>>>>>> >>>>>>> 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/CAH6s0fwv-rKrWnXji_r4scaX9_jtAi1CRUWGLLNRj7iZtme4UA%40mail.gmail.com >>>>>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fwv-rKrWnXji_r4scaX9_jtAi1CRUWGLLNRj7iZtme4UA%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/CAMZDCY1wvo_N32dKV1g-9cZAmTbZUO5bRAXDGkdHm-7_VD_-Rg%40mail.gmail.com >>>>>> <https://groups.google.com/d/msgid/clojure/CAMZDCY1wvo_N32dKV1g-9cZAmTbZUO5bRAXDGkdHm-7_VD_-Rg%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/CAH6s0fzjBE_F8%2BZ0fR69_1%3DWGs%3Duy5oJ3aGouYAmeQK9vRx6DA%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fzjBE_F8%2BZ0fR69_1%3DWGs%3Duy5oJ3aGouYAmeQK9vRx6DA%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/CADBYUPta6ZJf1gWCFq0L236aOZm077YeRrVqOxnfov%2Bk%2BjcZuQ%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/clojure/CADBYUPta6ZJf1gWCFq0L236aOZm077YeRrVqOxnfov%2Bk%2BjcZuQ%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/CAMZDCY2EUs9Y3xHtnZM4HkjnnuQG0jvmvmRrY-uVkDENvj9AQA%40mail.gmail.com >>> <https://groups.google.com/d/msgid/clojure/CAMZDCY2EUs9Y3xHtnZM4HkjnnuQG0jvmvmRrY-uVkDENvj9AQA%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/CAH6s0fx6qEFtBP8Xbtq5aDYx-ujBydeLto3pxv%3Dq9O_Y6k5A3A%40mail.gmail.com >> <https://groups.google.com/d/msgid/clojure/CAH6s0fx6qEFtBP8Xbtq5aDYx-ujBydeLto3pxv%3Dq9O_Y6k5A3A%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/CADBYUPs5cFVjCtmzfBr8gwnOESKr07%2BXYEzMvcNewLnAoDO7rA%40mail.gmail.com > <https://groups.google.com/d/msgid/clojure/CADBYUPs5cFVjCtmzfBr8gwnOESKr07%2BXYEzMvcNewLnAoDO7rA%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/CAH6s0fxj%2BSkY6Xzf98wNGfU27KDCXcHe02mWR8ASwMn5tZLxAQ%40mail.gmail.com.