#foo gensyms don't survive across a 'break' in quoting you can do
`(let [foo# bar] (other stuff (foo# ...))) but you can not do `(let [foo# bar] ~(for [i s] `(foo# ...))) or anything like that. The workaround is to create a gensym explicitly using (gensym), let that, and splice it in wherever you need the gensym. On Wed, Sep 30, 2015 at 1:29 PM Colin Yates <colin.ya...@gmail.com> wrote: > Hi all, > > I am banging my head against the wall - I think it is obvious but I have > started too long: > > The use-case is that I want a form which takes a set of children. The form > also takes in some form-wide state, like the form-wide validation, the > values for each item etc. I want the macro, for each child, to decorate > that child by extracting the validation errors and value from the form-wide > state. > > So, assuming: > - validation looks like {:name "Duplicate name" :age "You must be at > least 0"} > - form-values looks like {:name "a-duplicate-user" :age -1} > > then my form might look like: > > (form {:editing? true :values form-values :validation validation-report > :on-change handle-form-change} > [form/text {:id :name}] > [form/number {:id :age}]) > > After the macro I want the following code: > > [:div.form.horizontal > {:class "editing"} > [form/text {:id :name :value "a-duplicate-user" :errors "Duplicate name" > :on-click (fn [e] (handle-form-change :name (-> e .target .value])] > [form/number {:id :age :value "-1" :errors "You must be at least 0" > :on-click (fn [e] (handle-form-change :age (-> e .target .value))]] > > However, ideally the macro would _not_ emit the contents of the input as > literals but would emit code that inspects the provided parameters at > run-time (i.e. rather than :value "a-duplicate-user" I would much prefer > :value (-> state values :name) as that will allow me to pass in an atom for > example. > > I have tried so many variations and evaluating the state (e.g. (:editing? > state)) works fine as the emitted code has the destructured values, but > that doesn't work for an atom. > > Here is my attempt at trying to emit code that interrogates the provided > parameter. > > (defmacro form [state & elements] > (let [state# state] > `[:div.form.horizontal > {:class (if (:editing? state#) "editing" "editable")} > ~@(map (fn [[_ {:keys [id]} :as child]] > (update child 1 assoc > :editing? (:editing? state#) > :value `(-> (:values state#) 'deref (get ~id)) > :on-change `(fn [e#] > (js/console.log "E: " > (cljs.core/clj->js e#)) > ((:on-change state#) ~id (-> e# > .-target .-value))))) > elements)])) > > The error I am getting is that there is such var as the gen-sym's state# > in the namespace. > > The generic thing I am trying to do is remove the boilerplate from each of > the items in the form. > > Any and all suggestions are welcome. > > Thanks! > > -- > 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.