Not at all answering your question, but I would strongly suggest to at least deref `me` before calling the function, so it’s definition would be more like:
(defn svr [me slot] (when-let [sval (slot me)] (if (jz-ref sval) (condp type @sval) :jzi (:val @sval) :jzf ((:rule @sval) me) (error “jz-ref? type unknown”)) sval))) And I’d probably extract the body of if into a separate function (defn- body-of-if [me sval] (if (jz-ref sval) (condp type sval) :jzi (:val sval) :jzf ((:rule sval) me) (error “jz-ref? type unknown”)) sval)) so that your svr would end up something like (defn svr [slot me] (when-let [sval (slot me)] (body-of-if me @sval)) and then you’d call svr as (svr @me slot) This way, your functions don’t need to know that their arguments happen to be atoms/refs, and they fit nicely in with eg (swap! atom-that-contains-me svr slot) But I do agree with Timothy that you should probably try to keep your data structure free of atoms, and just use one atom to hold your data structure. Erik. > On 1. apr. 2016, at 07.37, hiskennyness <kentil...@gmail.com> wrote: > > With Jellz (ne Cells in CL) I want to make reading an attribute of an object > seem like a normal function call, but reading a cell actually looks like this: > > (defn- svr [slot me] ;; svr = slot-value-read, me = short version of "self" > (when-let [sval (slot @me)] > (cond > (jz-ref? sval) > (case (type @sval) > :jzi (:val @sval) > :jzf ((:rule @sval) me) > (error "jz-ref? type unknown" )) > :else sval))) > > svr is internal because I plan to hide it. Instead of coding (svr :mass > kenny) I want to code (mass kenny). And instead of hand-coding: > > (defn mass [me] (svr :mass me)) > > ...I want to code (jz/def-jzo-slot :mass). > > (defmacro def-jzo-slot [slot] > `(defn ~(symbol (subs (str slot) 1)) [~'me] > (com.tiltontec.jellz.api/svr ~slot ~'me))) > > That worked fine until I moved my testing hacks into a proper test file in > the test hierarchy and Clojure complained that svr was internal (I forget the > exact language). > > I broke down and made it defn instead of defn-, but was something else going > on? I am used to Common Lisp which sees what I am up to and worries about the > symbol being defined in the Cells package, not the package into which the > macroexpansion will be happening. > > I always thought that was very clever and classically XWIW (exactly what I > want), btw. > > This is not a big deal, but did I miss some way of keeping svr internal? > > -kt > > -- > 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. > For more options, visit https://groups.google.com/d/optout. -- 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. For more options, visit https://groups.google.com/d/optout.