You're missing the method name and arguments now. It should be: (reify INTERFACE (METHOD [ARGUMENTS] CODE))
On Sun, 18 Jul 2021, at 8:14 PM, Jack Park 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 >>> <mailto:clojure%2bunsubscr...@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 >> <mailto:clojure%2bunsubscr...@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>. -- James Reeves booleanknot.com -- 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/bf637bb0-ca4d-4e0e-be06-a0ecd62b3180%40www.fastmail.com.