I expect that each time I call :viral_load, it takes whatever value :epitopes or :mutations has at that point in time,
I can indeed write a function outside of the map that does the calculation, but I found the idea of an embedded function neat. Also writing a function only works as long as there is a limited number of functions in the model that describes how epitopes and mutations translates to viral load. However, if you would want to do something like an evolvable trade-off between epitopes and mutations in viruses, you would like to be able to store the functions inside each virus. On Dec 9, 8:40 pm, ataggart <alex.tagg...@gmail.com> wrote: > On Dec 9, 10:20 am, bOR_ <boris.sch...@gmail.com> wrote: > > > > > > > Hi all, > > > I want to make a hash-map where the value of one key depends on the > > values of other keys in the hash-map. Is there a way to do this, > > without needing an external reference to the hash-map? > > > {:a 1 :b 2 :c #(+ :a :b)} > > > Similarly, when filling a struct, I often want to refer to the bits I > > already have filled in. I solve that now by just embedding the (struct > > mything.. in a let, and just use the serial nature of let to calculate > > for example c from a and b. Is there a way that while filling a struct > > I can refer to it? > > > I would like to do this > > > (defstruct virus :epitopes :mutations :viral_load) > > (def myvirus (struct virus 3 5 (+ (* 0.1 :epitopes) (* > > 0.2 :mutations)))) > > > Instead of > > > (defstruct virus :epitopes :mutations :viral_load) > > (let [epitopes 3 > > mutations 5 > > viral_load (+ (* 0.1 epitopes) (* 0.2 mutations))] > > (def myvirus (struct virus epitopes mutations viral_load)) > > > As you can see there is some room for being more concise and compact > > if you can refer to keys in the same hash-map or struct, even if the > > hash-map / struct is still being constructed. > > Do you expect that modifying the values of :epitopes or :mutations > should be reflected in the value of :viral_load? If not, then you > could just write a custom function that creates virus instances > instead of using struct, e.g.: > > (defn viral-load [epitopes mutations] > (+ (* 0.1 epitopes) (* 0.2 mutations))) > > (defn make-virus [epitopes mutations] > (struct virus epitopes mutations (viral-load epitopes mutations))) > > If you *do* want :viral_load to reflect changes in the other values, > then I'd say you shouldn't include it in the struct. Actually, either > way this seems to be a caching mechanism which is both orthogonal to > the domain, and tends to be more trouble than it's worth in the long > run. In short, smells like OO instead of FP, but I could be wrong. -- 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