My first attempt at using records (showing my ignorance here) is found in this gist https://gist.github.com/KnowledgeGarden/0f6ce01ed9300d4f9bd0ee0c61e3d91b
It fails with this error (which doesn't give very good google) Syntax error macroexpanding clojure.core/defn at (cljtest/core.clj:123:1). > - failed: vector? at: [:fn-tail :arity-1 :params] spec: > :clojure.core.specs.alpha/param-list > - failed: (or (nil? %) (sequential? %)) at: [:fn-tail :arity-n :bodies] > spec: :clojure.core.specs.alpha/params+body > I wonder what I am missing. Thanks in advance for ideas. -Jack On Sat, Aug 15, 2020 at 4:18 PM Jack Park <jackp...@topicquests.org> wrote: > Brandon! > > That just might be the idea I needed. Thank you. > > Film at 11... > > On Sat, Aug 15, 2020 at 2:28 PM Brandon R <brandon.ri...@gmail.com> wrote: > >> Hey Jack, >> >> Just been a fly on the wall for this convo, and aside from offering a >> specific solution, which others have done, I'm pretty certain this can be >> done with just protocols and records. Make a record (like your type) that >> implements the two protocols (like your interfaces). You could achieve your >> desired functionality without records and protocols but what you describe >> sounds like a fitting case for them. >> >> Members in such lists can be either other evaluable lists, or they can be >>> evaluable objects which perform computations >>> >> >> A simple Clojure list/vector can hold any type of data you put into it. >> So your record can hold a vector of these things, which can be represented >> as Clojure data structure (lists / maps / etc). >> >> You say you *need* to construct a type, but I urge you to challenge this >> assumption, again and again if needed. I think it's natural to think you >> need a type because of coming from Java/OOP land, especially if you were >> there a long time. Old patterns die hard? >> >> I could be wrong though. :) >> >> >> My 2 cents, >> Brandon >> >> On Sat, Aug 15, 2020 at 12:42 PM Jack Park <jackp...@topicquests.org> >> wrote: >> >>> Hi Erik, >>> >>> I think that teasing things apart helps along some dimensions, but the >>> problem I face, still thinking like a Java hacker, is that I need to put >>> things together: >>> >>> I need to construct a *type* (deftype) which honors two different >>> interfaces, a list, and an evaluable object. I need the type because I want >>> to create it, then add members to the list, and then one of: >>> a) insert the object into another one (building and/or trees) >>> b) evaluate it - when it is the root of the tree. >>> >>> Members in such lists can be either other evaluable lists, or they can >>> be evaluable objects which perform computations - even with side effects - >>> but which return a boolean. >>> >>> The several ideas posted in this thread are greatly helping me to see >>> through this situation with fresh eyes, but, thus far, nothing has >>> convinced me to drop the goal of creating a type which is a list and >>> evaluable, into which I can insert conjunction or disjunction evaluators. >>> >>> Many thanks, >>> Jack >>> >>> On Sat, Aug 15, 2020 at 12:14 AM Erik Assum <e...@assum.net> wrote: >>> >>>> Why not tease things apart? >>>> >>>> (defn eval [x] ...) >>>> >>>> (some eval my-list) ;; or list >>>> (every? eval my-list) ;; and list >>>> >>>> https://clojuredocs.org/clojure.core/some >>>> https://clojuredocs.org/clojure.core/every_q >>>> >>>> Now, you can make the eval function polymorphic in several ways, >>>> simplest is to case or cond on some property of x. You could also use >>>> multimethods or a protocol to achieve this. >>>> >>>> https://insideclojure.org/2015/04/27/poly-perf/ >>>> >>>> Erik. >>>> -- >>>> i farta >>>> >>>> 15. aug. 2020 kl. 02:04 skrev matthew...@gmail.com < >>>> matthewdowne...@gmail.com>: >>>> >>>> >>>> >>>> Another option would be to do what Alex is suggesting and define and >>>> as a function. Just because it’s a macro in clojure.core doesn’t mean you >>>> can’t write your own :) >>>> >>>> (defn eval' [x] >>>> (if (map? x) >>>> (apply (:fn x) (:coll x)) >>>> x)) >>>> >>>> (defn and-list [& items] >>>> (let [if? (fn [x] (if x true false)) >>>> and' (fn [& args] (every? if? args))] >>>> {:fn and' :coll items})) >>>> >>>> (eval' true) ;=> true >>>> (eval' false) ;=> false >>>> (eval' (and-list 1 2 3)) ;=> true >>>> (eval' (and-list 1 2 3 false)) ;=> false >>>> >>>> Ditto with or. >>>> >>>> On Friday, August 14, 2020 at 4:27:19 PM UTC-5 jack...@topicquests.org >>>> wrote: >>>> >>>>> Alex, >>>>> >>>>> I plan to explore this idea. >>>>> Many thanks! >>>>> >>>>> Jack >>>>> >>>>> On Fri, Aug 14, 2020 at 1:38 PM Oleksandr Shulgin < >>>>> oleksand...@zalando.de> wrote: >>>>> >>>>>> <snip.> >>>>>> >>>>>> >>>>>> Nevermind transducers: I've just realized that reduced can be used >>>>>> with the normal reduce. E.g. here's short-circuiting AND-reduction fn: >>>>>> >>>>>> (defn andr >>>>>> ([] true) >>>>>> ([i] i) >>>>>> ([r i] (let [o (and r i)] >>>>>> (if o >>>>>> o >>>>>> (reduced o))))) >>>>>> >>>>>> When it comes to the actual lists, it depends how you'd like to >>>>>> represent them. E.g. I could imagine something like the following can >>>>>> be a >>>>>> useful notation: >>>>>> >>>>>> [:and 1 2 [:or 3 4] 5] >>>>>> >>>>>> or even more direct: >>>>>> >>>>>> (quote (and 1 2 (or 3 4) 5)) >>>>>> >>>>>> If you really want an interface-like look and feel, then protocols >>>>>> might be the right answer: >>>>>> >>>>>> (defprotocol Evaluable >>>>>> (evaluate [this])) >>>>>> >>>>>> (defrecord AndList [items] >>>>>> Evaluable >>>>>> (evaluate [this] >>>>>> (reduce andr (:items this)))) >>>>>> >>>>>> user> (evaluate (->AndList [1 2 3])) >>>>>> 3 >>>>>> user> (evaluate (->AndList [1 false 3])) >>>>>> false >>>>>> >>>>>> To complete it, you'll need to add the OrList and sneak (map >>>>>> evaluate) in the reduce call in both And- and OrList. >>>>>> >>>>>> Cheers, >>>>>> -- >>>>>> Alex >>>>>> >>>>> <snip> >>>>>> >>>>> -- >>>> 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/cfac729f-b8e4-4f95-94b0-78345d10f457n%40googlegroups.com >>>> <https://groups.google.com/d/msgid/clojure/cfac729f-b8e4-4f95-94b0-78345d10f457n%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/5B42B3BC-E20D-446E-82EF-0D1BFC36DA5F%40assum.net >>>> <https://groups.google.com/d/msgid/clojure/5B42B3BC-E20D-446E-82EF-0D1BFC36DA5F%40assum.net?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/CAH6s0fxkuHFOnWkJxAOytk5xHpYNR0FxvT0aF7A-783kTa3UmQ%40mail.gmail.com >>> <https://groups.google.com/d/msgid/clojure/CAH6s0fxkuHFOnWkJxAOytk5xHpYNR0FxvT0aF7A-783kTa3UmQ%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/CAB_6y6GYJxQznBw8E6rxAjGoCvp9eh67OKuv2Z6v54FzA6-pRg%40mail.gmail.com >> <https://groups.google.com/d/msgid/clojure/CAB_6y6GYJxQznBw8E6rxAjGoCvp9eh67OKuv2Z6v54FzA6-pRg%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/CAH6s0fxCkMgtcSWo8Pd28YRd3v6VV1iHCe4ay%2B52fdHjmqOXZw%40mail.gmail.com.