That's precisely how I coded it. Just need to run some tests, then on to more complex testing with nested lists and so forth.
Thanks! On Sat, Jul 24, 2021 at 12:03 AM Cora Sutton <c...@sutton.me> wrote: > not, in clojure, is itself a function, so it would just be wrapping a > other function call in (not (my-fn)). there is no limit to the recursion > here, you can have functions in functions in functions > > On Fri, Jul 23, 2021 at 9:54 PM Jack Park <jackp...@topicquests.org> > wrote: > >> Cora, >> >> That's simply amazing. I added one more "or" test: all-false. >> >> I confess, I'm not yet at the place where I look at that pattern and >> recognize it, but, thanks to you and to the other hints I received here, I >> now have something to work with. >> >> Next up for me will be to test the "not" functions. >> >> Many thanks! >> >> -Jack >> >> On Fri, Jul 23, 2021 at 6:03 PM Cora Sutton <c...@sutton.me> wrote: >> >>> You can stay away from eval unless you have extremely special needs, >>> really. I never use it myself. The evaluate-or-fns and evaluate-and-fns >>> don't care what the function is, it could be another call to >>> evaluate-or-fns or evaluate-and-fns, and in this way you can recurse as >>> deeply as you desire and only evaluate when you actually want values out of >>> it. >>> >>> (defn evaluate-and-fns >>> "Returns true if every function in members returns a value that is >>> true-ish according to Clojure's >>> truthiness rules. Otherwise returns false." >>> [members] >>> (every? (fn [member] >>> (member)) >>> members)) >>> >>> (defn evaluate-or-fns >>> "Returns true if any function in members returns a value that is >>> true-ish according to Clojure's >>> truthiness rules. Otherwise returns false." >>> [members] >>> (boolean >>> (some (fn [member] >>> (member)) >>> members))) >>> >>> (evaluate-or-fns [(fn [] >>> (evaluate-and-fns [(fn [] (evaluate-and-fns >>> [simple-true-fn simple-true-fn])) >>> simple-true-fn])) >>> (fn [] >>> (evaluate-and-fns [simple-true-fn >>> simple-false-fn]))]) >>> >>> On Fri, Jul 23, 2021 at 7:22 PM Jack Park <jackp...@topicquests.org> >>> wrote: >>> >>>> Hello again, Cora (and list!) >>>> >>>> I have your gist running, then added a new feature >>>> >>>> https://gist.github.com/KnowledgeGarden/330b4147cd3d4909ef55684fc4c1f00d >>>> >>>> The first code was for conjunctive lists, I added disjunctive lists >>>> >>>> There, I started with some? but could not make the grade, ended up with >>>> some fn where fn is eval. That's the code. >>>> It's behaving strangely, but maybe I'm on the right track. >>>> >>>> Where this is going is that a list can be populated with things other >>>> than simple functions like SimpleTrue; can be populated with conjunctive >>>> and disjunctive lists, each of which can be similarly populated. That, of >>>> course, means that evaluating a single inferrable list is the same as >>>> walking a possibly complex (no loops, hopefully) spider web. >>>> >>>> Thanks >>>> Jack >>>> >>>> On Mon, Jul 19, 2021 at 6:04 PM Cora Sutton <c...@sutton.me> wrote: >>>> >>>>> Hello again, Jack. I'm not sure what your code looked like before or >>>>> looks like now but I think maybe a different way of helping you out with >>>>> this is in order. Here's some code that does what I think you're going for >>>>> and runs: >>>>> >>>>> https://gist.github.com/corasaurus-hex/1c86b545644b734310a15d984f61ad99 >>>>> >>>>> Have a look, play with it a bit, change around value and see what >>>>> breaks. Hope that's helpful! >>>>> >>>>> On Mon, Jul 19, 2021 at 5:55 PM Jack Park <jackp...@topicquests.org> >>>>> wrote: >>>>> >>>>>> Did. That suggestion was made earlier. Did not change anything. >>>>>> >>>>>> Here's a test which ran just fine >>>>>> (def x (evaluate_and (list true true))) >>>>>> (println "A" x) >>>>>> (def y (evaluate_and (list true false))) >>>>>> (println "B" y) >>>>>> >>>>>> But, the moment I attempt to make a list with two functions in it, >>>>>> the code breaks and returns - without any errors - not a boolean, but the >>>>>> structure I passed it. >>>>>> >>>>>> >>>>>> On Mon, Jul 19, 2021 at 3:43 PM Cora Sutton <c...@sutton.me> wrote: >>>>>> >>>>>>> Those are functions that call booleans as functions. Try this: >>>>>>> >>>>>>> (defn simple-true [] true) >>>>>>> >>>>>>> On Mon, Jul 19, 2021 at 5:41 PM Jack Park <jackp...@topicquests.org> >>>>>>> wrote: >>>>>>> >>>>>>>> Great points! >>>>>>>> They are filled with functions which look like this >>>>>>>> >>>>>>>> (defn simple_true [] (true)) >>>>>>>> >>>>>>>> They are not booleans but functions which return a boolean. >>>>>>>> Here is a list of two of those as produced by the code: >>>>>>>> >>>>>>>> (#object[ie4clj.Tests$simple_false 0x3a4621bd >>>>>>>> ie4clj.Tests$simple_false@3a4621bd] >>>>>>>> #object[ie4clj.Tests$simple_false 0x3a4621bd >>>>>>>> ie4clj.Tests$simple_false@3a4621bd]) >>>>>>>> >>>>>>>> Or maybe I missed something. >>>>>>>> >>>>>>>> On Mon, Jul 19, 2021 at 3:33 PM Cora Sutton <c...@sutton.me> wrote: >>>>>>>> >>>>>>>>> Your members list needs to be filled with things that can be >>>>>>>>> called as functions, since that's what that code snippet does, and >>>>>>>>> booleans >>>>>>>>> definitely cannot be called as functions. That's what the error means, >>>>>>>>> there's a boolean in your list and it's trying to cast it to an IFn (a >>>>>>>>> Clojure function interface) when it is called as (member). >>>>>>>>> >>>>>>>>> Can you show the lists you construct? Are they full of functions >>>>>>>>> that take no arguments? Do you want the lists to be able to contain >>>>>>>>> booleans too? >>>>>>>>> >>>>>>>>> On Mon, Jul 19, 2021 at 2:57 PM Jack Park < >>>>>>>>> jackp...@topicquests.org> wrote: >>>>>>>>> >>>>>>>>>> Cora >>>>>>>>>> >>>>>>>>>> (every? (fn [member] (member)) members) >>>>>>>>>> works fine on [constantly true & false >>>>>>>>>> but fails with >>>>>>>>>> java.lang.Boolean cannot be cast to clojure.lang.IFn >>>>>>>>>> on the lists I construct. >>>>>>>>>> >>>>>>>>>> In truth, I thought all the code was working, but that turned out >>>>>>>>>> ot be an artifact of the test I designed. When I changed the test >>>>>>>>>> conditions, evaluate_and failed. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 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/CAH6s0fyc%2BctV%2B1OgzWRYLsWevL97ouVkS1FGf0uGFtTcznRjUg%40mail.gmail.com >>>>>>>>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fyc%2BctV%2B1OgzWRYLsWevL97ouVkS1FGf0uGFtTcznRjUg%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/CAMZDCY0qvUUrTmQtfcUocwWbr50juXzoZt%3DSmPr%3D0o%3DgRXoM2A%40mail.gmail.com >>>>>>>>> <https://groups.google.com/d/msgid/clojure/CAMZDCY0qvUUrTmQtfcUocwWbr50juXzoZt%3DSmPr%3D0o%3DgRXoM2A%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/CAH6s0fxJXPC8Y%3DY_UEAsAyMek4FZwo%2BP9bVahzrVKQLKGd%3D3Lg%40mail.gmail.com >>>>>>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fxJXPC8Y%3DY_UEAsAyMek4FZwo%2BP9bVahzrVKQLKGd%3D3Lg%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/CAMZDCY3BKpWAu6%3D%2BEC6o3PSGg7CXETgyZymOBKLnhEJYG7UVdQ%40mail.gmail.com >>>>>>> <https://groups.google.com/d/msgid/clojure/CAMZDCY3BKpWAu6%3D%2BEC6o3PSGg7CXETgyZymOBKLnhEJYG7UVdQ%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/CAH6s0fz-Y9c9asSx85jrvrHvjLdX2qgLgjt8yPdxpHu_4X_vGg%40mail.gmail.com >>>>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fz-Y9c9asSx85jrvrHvjLdX2qgLgjt8yPdxpHu_4X_vGg%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/CAMZDCY2fYJoAVPxngBiib41-2T%3DWsKL3QNQhw6%3DZe%2BpSKuPQKg%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/clojure/CAMZDCY2fYJoAVPxngBiib41-2T%3DWsKL3QNQhw6%3DZe%2BpSKuPQKg%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/CAH6s0fwFaouR1%2B0xAKzb-rc61WhTv-aant4Pn%3DMmYshjp-Bcmw%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/clojure/CAH6s0fwFaouR1%2B0xAKzb-rc61WhTv-aant4Pn%3DMmYshjp-Bcmw%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/CAMZDCY2%3DQot1%3DYUrLSAY9Dp3%2BSYSTsu8Xbr1aY34yFDFhFA_hw%40mail.gmail.com >>> <https://groups.google.com/d/msgid/clojure/CAMZDCY2%3DQot1%3DYUrLSAY9Dp3%2BSYSTsu8Xbr1aY34yFDFhFA_hw%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/CAH6s0fypDuf82H36-7ODPOSjc%2B%2BEH46WUDoYHhhAOjX3%2BpUNDA%40mail.gmail.com >> <https://groups.google.com/d/msgid/clojure/CAH6s0fypDuf82H36-7ODPOSjc%2B%2BEH46WUDoYHhhAOjX3%2BpUNDA%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/CAMZDCY0e60k0dXov-K0R0Oq1bQ-wN7bTugf%3D%3DMt%2BcFXS8wnayQ%40mail.gmail.com > <https://groups.google.com/d/msgid/clojure/CAMZDCY0e60k0dXov-K0R0Oq1bQ-wN7bTugf%3D%3DMt%2BcFXS8wnayQ%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/CAH6s0fzGW8m1O1gXnVreGPhOar4GO%3D41LJMed1OtGnzFzLT%2BkQ%40mail.gmail.com.